适配Android12时MANAGE_EXTERNAL_STORAGE权限申请后回调未触发
问题根因及修复方案
核心问题1:MANAGE_EXTERNAL_STORAGE授权页不会返回RESULT_OK
Android 11(API 30)及以上的ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION系统授权页,无论用户选择允许还是拒绝,返回给调用方的resultCode固定为Activity.RESULT_CANCELED,你当前只在resultCode == RESULT_OK时才执行后续逻辑,自然看起来回调没有触发。
核心问题2:两个回调的触发场景混淆
onRequestPermissionsResult仅用于普通危险权限的动态申请回调,也就是Android 11以下调用ActivityCompat.requestPermissions的场景才会触发- 跳系统设置页申请
MANAGE_EXTERNAL_STORAGE的场景,只会触发registerForActivityResult的StartActivityForResult回调,不会走onRequestPermissionsResult
核心问题3:低版本权限申请入参错误
低于Android 11的场景下,你传入的申请参数是Manifest.permission_group.STORAGE权限组,官方要求必须传入具体的权限名称,不能直接传入权限组,部分机型会直接拒绝申请导致回调异常。
修复代码
1. 修改registerLauncher逻辑,取消resultCode判断,直接校验权限
private void registerLauncher() { permissionLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { // 不依赖系统返回的resultCode,主动校验权限是否授予 if (checkPermissionsGranted()) { initMainActivity(); } else { // 权限未授予的自定义逻辑:比如提示用户必须授予权限才能使用,引导重新授权 } } }); }
2. 修改低版本权限申请参数
private void requestPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { try { Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); intent.setData(Uri.parse(String.format("package:%s", getApplicationContext().getPackageName()))); permissionLauncher.launch(intent); } catch (Exception e) { Log.e(TAG, "Exp... " + e.toString()); Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION); permissionLauncher.launch(intent); } } else { // 替换权限组为具体的存储权限 ActivityCompat.requestPermissions(Splashscreen.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, AppConstants.STORAGE_PERMISSION_CODE); } }
3. 补充低版本权限回调处理
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == AppConstants.STORAGE_PERMISSION_CODE) { if (checkPermissionsGranted()) { initMainActivity(); } else { // 权限未授予的自定义逻辑 } } }
4. 检查AndroidManifest.xml权限声明
确保已添加对应权限:
<!-- 低版本存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- Android 11+ 全文件管理权限 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
内容的提问来源于stack exchange,提问作者Inzimam Tariq IT
相关产品推荐
相关产品推荐

