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()重新检测权限即可。其他注意事项
- 确保应用的
targetSdkVersion设置为30或更高,因为MANAGE_EXTERNAL_STORAGE是Android 11(API 30)才引入的权限。 - 不要用
Manifest.MANAGE_EXTERNAL_STORAGE构建请求Intent,正确方式就是你原来用的Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION,这也是避免ActivityNotFoundException的关键。
- 确保应用的
内容的提问来源于stack exchange,提问作者Drained
相关产品推荐
相关产品推荐

