适配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
相关产品推荐
相关产品推荐

