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

Android10升级到11后访问原有存储文件出现EACCES权限拒绝问题

问题根因

当targetSdkVersion升级到30及以上时,Android 11系统会强制启用分区存储机制,Android 10上配置的android:requestLegacyExternalStorage="true"兼容属性会直接失效,普通的READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE权限仅能访问MediaStore中的媒体类文件,无法直接访问公共目录下的自定义非媒体文件,这就是你能检测到文件存在但无读取权限、申请权限不弹窗的核心原因。
仅升级系统的设备会触发问题是因为:未升级的Android 10设备即便应用targetSdk为30,legacy存储兼容开关仍然生效,可正常访问旧路径文件;升级到Android 11后系统强制分区存储,兼容开关失效,就会出现权限拒绝报错。

解决方案

方案1:申请全量文件访问权限(适合文件管理、备份类需要访问全量公共存储的应用)

  1. 在AndroidManifest.xml中新增特殊权限声明:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
  1. 运行时跳转系统权限设置页,引导用户手动授予所有文件访问权限:
private static final int REQUEST_MANAGE_STORAGE = 1001;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    if (!Environment.isExternalStorageManager()) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
        intent.setData(Uri.parse("package:" + getPackageName()));
        startActivityForResult(intent, REQUEST_MANAGE_STORAGE);
    }
}

授权后即可正常读取公共目录下的所有文件。

方案2:适配分区存储(推荐,符合Google官方规范,无权限风险)

把应用产生的私有文件迁移到应用专属外部存储目录,该目录下的文件不需要申请任何存储权限即可自由读写,适配步骤:

  1. 获取应用专属目录路径:
// 该方法返回路径为 /storage/emulated/0/Android/data/你的应用包名/files
File appPrivateDir = getExternalFilesDir(null);
  1. 将之前存放在公共自定义目录下的文件批量迁移到上述专属目录中,后续读写直接操作该目录下的文件即可。如果需要应用卸载后文件仍然保留,可以将文件存入MediaStore对应的公共媒体目录。

方案3:临时兼容方案(仅适合过渡,上架Google Play会受限制)

暂时将targetSdkVersion回退到29,此时android:requestLegacyExternalStorage="true"属性在Android 11上仍然可以生效,可继续沿用原来的文件访问逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:15:01