You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 12无法检测MANAGE_EXTERNAL_STORAGE权限授权问题求助

问题:Android 12下MANAGE_EXTERNAL_STORAGE权限检测始终返回false,导致无限循环

应用需要访问用户可正常访问的所有文件和文件夹,用于选择下载文件的目录,但目前陷入启动设置页面的无限循环——在设置界面完成权限授权后,检测权限时始终返回false。

权限请求代码

requestIntent  = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, Uri.parse("package:" + BuildConfig.APPLICATION_ID));
       
if(hasPerms == true){

}else {
   intentActivityResultLauncher.launch(requestIntent);
}
   private ActivityResultLauncher<Intent> intentActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
        @Override
        public void onActivityResult(ActivityResult o) {
            if (o.getResultCode() == RESULT_OK) {
                //...
            }else{
                //...
            }
        }
    });

权限检测代码(检测结果全为false)

hasPerms = checkSelfPermission(Manifest.permission.MANAGE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
Log.i(TAG, "onStart: "+hasPerms);
hasPerms = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
Log.i(TAG, "onStart: "+hasPerms);
hasPerms = checkSelfPermission(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) == PackageManager.PERMISSION_GRANTED;
Log.i(TAG, "onStart: "+hasPerms);

Manifest权限声明

<manifest xmlns:androi="http://schemas.android.com/apk/distribution"
          xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

额外问题:使用Manifest.MANAGE_EXTERNAL_STORAGE请求权限会抛出ActivityNotFoundException。


解决方案
  • 核心问题:权限检测API用错
    checkSelfPermission()仅适用于检测普通危险权限,MANAGE_EXTERNAL_STORAGE属于特殊权限,必须用Environment.isExternalStorageManager()来判断权限是否授予,这是检测始终返回false的根本原因。

  • 修正权限检测逻辑
    替换原检测代码为:

hasPerms = Environment.isExternalStorageManager();
Log.i(TAG, "onStart: "+hasPerms);
  • 修正ActivityResult处理逻辑
    设置页面不会返回RESULT_OK或其他结果码,不能依赖返回结果判断权限状态。在onActivityResult回调里,直接调用Environment.isExternalStorageManager()重新检测权限即可。

  • 其他注意事项

    1. 确保应用的targetSdkVersion设置为30或更高,因为MANAGE_EXTERNAL_STORAGE是Android 11(API 30)才引入的权限。
    2. 不要用Manifest.MANAGE_EXTERNAL_STORAGE构建请求Intent,正确方式就是你原来用的Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION,这也是避免ActivityNotFoundException的关键。

内容的提问来源于stack exchange,提问作者Drained

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 16:23:15