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

适配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:54:00