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

适配SDK30申请MANAGE_ALL_FILES_ACCESS_PERMISSION报No Activity found错误如何解决

问题原因

MANAGE_ALL_FILES_ACCESS_PERMISSION是Android 11(API 30)才新增的权限,对应的系统设置跳转Action也是API 30才加入的。你使用的测试设备是Android 10(API 29)系统,本身不支持这个权限和对应的跳转路径,所以会抛出ActivityNotFoundException,和你的代码逻辑无关。

正确适配方案

1. 清单文件配置

<!-- 安卓11及以上所需的全文件访问权限,如非必要不建议申请 -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<!-- 安卓10及以下兼容旧存储权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
<application
    ...
    <!-- 安卓10开启旧存储适配,无需适配分区存储逻辑 -->
    android:requestLegacyExternalStorage="true"
    ...>

2. 权限申请逻辑调整

将版本判断分界从API 29改为API 30即可:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    // 仅安卓11及以上走全文件权限跳转逻辑
    try {
        Uri uri = Uri.parse("package:" + BuildConfig.APPLICATION_ID);
        Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, uri);
        startActivity(intent);
    } catch (Exception ex){
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
        startActivity(intent);
    }
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    // 安卓6.0-安卓10走旧的存储权限申请逻辑
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
            100);
}

优化建议

如果你的需求仅为应用内下载安装APK,完全不需要申请全文件访问权限:

  • 仅需在清单中声明REQUEST_INSTALL_PACKAGES权限
  • 将下载的APK存入应用专属外部存储目录(context.getExternalFilesDir(null))即可直接发起安装,不需要申请任何公共存储权限,也不需要适配分区存储规则,上线应用商店也不会因为权限问题被拦截。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:06:02