Android 11 MANAGE_EXTERNAL_STORAGE权限配置后无法访问存储问题求助
问题原因
- Android 11(API 30)及以上版本中,
MANAGE_EXTERNAL_STORAGE属于特殊的「所有文件访问权限」,不能通过普通的运行时权限申请流程授权,现有代码里用ActivityCompat.requestPermissions申请该权限是无效的,即使弹出普通权限弹窗用户同意也不会真正授予该权限。 - 检查
MANAGE_EXTERNAL_STORAGE是否授予也不能用ContextCompat.checkSelfPermission,需要用专门的Environment.isExternalStorageManager()方法判断。
需要补充/修改的代码
1. 适配权限检查逻辑
修改notGrantedPermission方法,增加Android 11以上存储权限的特殊判断,未导入的类按需补导入即可:
private boolean notGrantedPermission(String permission) { // 适配Android11以上的所有文件访问权限检查 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && permission.equals(Manifest.permission.MANAGE_EXTERNAL_STORAGE)) { return !Environment.isExternalStorageManager(); } return ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED; }
2. 适配特殊权限申请逻辑
修改requestPermissions方法,对MANAGE_EXTERNAL_STORAGE走单独的系统权限页申请流程:
public void requestPermissions() { // 判断当前申请的权限是否包含Android11以上的存储特殊权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { for (String permission : permissions) { if (permission.equals(Manifest.permission.MANAGE_EXTERNAL_STORAGE)) { // 跳转到系统的所有文件访问权限授予页 Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); intent.setData(Uri.parse("package:" + activity.getPackageName())); activity.startActivityForResult(intent, requestCode); return; } } } // 其他普通权限走原有申请逻辑 ActivityCompat.requestPermissions(activity, permissions, requestCode); }
3. 补充特殊权限的结果接收逻辑
MANAGE_EXTERNAL_STORAGE的申请结果是通过onActivityResult返回,不是通过onRequestPermissionsResult,需要在你的MainActivity里重写onActivityResult方法,主动触发权限校验:
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); // 替换STORAGE_REQUEST_CODE为你实际申请存储权限时传入的requestCode if (requestCode == STORAGE_REQUEST_CODE && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // 主动检查存储权限是否已经授予,触发后续回调 permissionsManager.checkPermissions(new String[]{Manifest.permission.MANAGE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_REQUEST_CODE); } }
注意事项
- 如果你的应用只需要访问媒体文件(图片/视频/音频),不需要访问全量外置存储,可以去掉
MANAGE_EXTERNAL_STORAGE权限的申请,仅保留READ_EXTERNAL_STORAGE即可正常使用,不需要跳转到特殊权限页,也更容易通过应用商店审核。 - 申请
MANAGE_EXTERNAL_STORAGE的应用在应用商店上架时需要提交权限用途说明,不符合使用场景的应用会被拒审。
内容的提问来源于stack exchange,提问作者reda
相关产品推荐
相关产品推荐

