Android 11如何判断应用当前是否拥有All Files Access权限
Android 11 所有文件访问(All Files Access)权限校验方案
Android 11(API 30)引入的分区存储机制中,All Files Access属于特殊权限,无法用普通运行时权限的checkSelfPermission方法校验,需按系统版本做兼容处理:
- 系统版本低于API 30(Android 11):不存在该权限项,只要应用获得
READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE普通存储权限,即拥有全文件访问能力。 - 系统版本为API 30及以上:直接调用系统公开API
Environment.isExternalStorageManager()判断,方法返回true即为已授权,返回false即为未授权。
可直接复用的校验方法代码
public boolean checkAllFilesAccessPermission() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { // 低版本校验普通存储权限状态 return ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; } // Android 11及以上版本走专用校验逻辑 return Environment.isExternalStorageManager(); }
配套注意事项
不要完全依赖
startActivityForResult的回调结果判断授权状态。部分定制ROM修改了系统权限页的返回逻辑,不会返回标准resultCode,建议在页面onResume生命周期中重新调用上述校验方法,获取真实权限状态,避免判断失效。
必要清单配置
使用该权限必须先在AndroidManifest.xml中添加对应声明,否则跳转至权限设置页后不会显示授权开关:
<!-- 所有文件访问权限声明 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <!-- 低版本兼容用普通存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
完整调用示例
结合你之前的权限申请跳转逻辑,完整调用流程如下:
private final int REQ_ALL_FILES_ACCESS = 2296; // 触发权限申请 private void requestAllFilesPermission() { if (checkAllFilesAccessPermission()) { // 已获得权限,直接执行业务逻辑 executeFileBusiness(); return; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { 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, REQ_ALL_FILES_ACCESS); } else { // 低版本申请普通存储权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1001); } } @Override protected void onResume() { super.onResume(); // 从权限设置页返回时,重新校验权限状态 if (checkAllFilesAccessPermission()) { executeFileBusiness(); } }
内容的提问来源于stack exchange,提问作者Oky Prasetya
相关产品推荐
相关产品推荐

