如何知道应用当前是否具有'All Files Access'权限。安卓 11



但是如何验证应用程序当前是否具有'所有文件访问'权限。我用这种方法征求许可。

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 ()

相关内容

最新更新