但是如何验证应用程序当前是否具有'所有文件访问'权限。我用这种方法征求许可。
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse(String.format("package:%s",this.getPackageName())));
startActivityForResult(intent, 2296);
请帮我解决这个问题:(
在您的manifest.xml
中声明此权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
查询MANAGE_EXTERNAL_STORAGE
:
try {
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.setData(Uri.parse(String.format("package:%s", getApplicationContext().getPackageName())));
startActivityForResult(intent, 2296);
} catch (Exception e) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
startActivityForResult(intent, 2296);
}
得到你的结果在onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 2296) {
if (SDK_INT >= Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
// perform action when allow permission success
} else {
Toast.makeText(this, "Allow permission for storage access!", Toast.LENGTH_SHORT).show();
}
}
}
}
基本上你可以检查权限是否在Android11中被授予,像这样;
if (SDK_INT >= Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
// Permission Granted
}
}
在内存的根目录下创建一个0字节的虚拟文件,然后删除它。如果两个操作都成功了,你就可以进入了。当你没有访问权限时,你的代码将throw Exception
(在创建文件步骤上),你可以try{ }catch(Exception e)
(防止应用程序崩溃)
内部/外部/共享的路径可以从Environment
类获得,我会首先尝试getExternalStorageDirectory
我是这样做的:
public static boolean hasAllFilesAccess(Context context) {
AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
try {
ApplicationInfo app = context.getPackageManager().getApplicationInfo(context.getPackageName(), 0);
return appOpsManager.unsafeCheckOpNoThrow("android:manage_external_storage",app.uid, context.getPackageName()) == AppOpsManager.MODE_ALLOWED;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
catch (NoSuchMethodError e)
{
return true;
}
return false;
}
似乎现在有一个更好的方法:
Environment.isExternalStorageManager ()