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:申请全量文件访问权限(适合文件管理、备份类需要访问全量公共存储的应用)
- 在AndroidManifest.xml中新增特殊权限声明:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
- 运行时跳转系统权限设置页,引导用户手动授予所有文件访问权限:
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官方规范,无权限风险)
把应用产生的私有文件迁移到应用专属外部存储目录,该目录下的文件不需要申请任何存储权限即可自由读写,适配步骤:
- 获取应用专属目录路径:
// 该方法返回路径为 /storage/emulated/0/Android/data/你的应用包名/files File appPrivateDir = getExternalFilesDir(null);
- 将之前存放在公共自定义目录下的文件批量迁移到上述专属目录中,后续读写直接操作该目录下的文件即可。如果需要应用卸载后文件仍然保留,可以将文件存入MediaStore对应的公共媒体目录。
方案3:临时兼容方案(仅适合过渡,上架Google Play会受限制)
暂时将targetSdkVersion回退到29,此时android:requestLegacyExternalStorage="true"属性在Android 11上仍然可以生效,可继续沿用原来的文件访问逻辑。
内容的提问来源于stack exchange,提问作者Cocolucoco
相关产品推荐
相关产品推荐

