Android Studio 如何知道应用程序当前是否具有“所有文件访问”权限,Android 11

2ekbmq32  于 2022-12-13  发布在  Android
关注(0)|答案(3)|浏览(403)

而是如何验证应用程序当前是否具有“所有文件访问”权限。我使用此方法来请求权限。

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

请帮我解决这个问题:(

x8diyxa7

x8diyxa71#

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

基本上,你可以在Android 11中检查权限是否被授予,就像这样;

if (SDK_INT >= Build.VERSION_CODES.R) {
   if (Environment.isExternalStorageManager()) {
      // Permission Granted
   }
}
w8rqjzmb

w8rqjzmb2#

在内存的根目录中创建新的虚拟0字节文件,然后删除它。如果两个操作都成功,那么你有访问权限。当你没有访问权限时,那么你的代码将throw Exception(在创建文件的步骤),你可以try{ }catch(Exception e)(防止应用程序崩溃)
内部/外部/共享路径可以从Environment类获得,我会首先尝试getExternalStorageDirectory

9rbhqvlz

9rbhqvlz3#

我是这么做的:

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;
}

不过现在似乎还有一个更好的办法:
环境. isExternalStorage管理器()

相关问题