已授予ALL_FILES_ACCESS仍缺失WRITE_EXTERNAL_STORAGE权限问题
问题分析与解决方案
为何提示缺少WRITE_EXTERNAL_STORAGE权限?
- Scoped Storage权限机制冲突:从Android 10(API 29)开始,
WRITE_EXTERNAL_STORAGE的权限逻辑被Scoped Storage重构。当应用获取MANAGE_EXTERNAL_STORAGE(即ALL_FILES_ACCESS)权限后,系统不会自动同步WRITE_EXTERNAL_STORAGE的权限状态——这两个权限在系统层面是独立标识,但MANAGE_EXTERNAL_STORAGE已经完全覆盖了WRITE_EXTERNAL_STORAGE的读写能力。如果你的代码仍在检查WRITE_EXTERNAL_STORAGE的权限状态,就会触发“无权限”提示,因为系统并未单独授予该权限。 - 代码逻辑未适配全文件访问权限:若应用仍通过
checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)判断存储写入权限,会得到错误结果。拥有MANAGE_EXTERNAL_STORAGE后,无需依赖传统的写权限,但旧逻辑会误判权限状态并触发请求。
为何应用设置中无存储权限选项?
- 系统权限入口合并:当应用申请
MANAGE_EXTERNAL_STORAGE后,系统会将传统的“存储”权限入口替换为“所有文件访问权限”开关,因此不再显示单独的WRITE_EXTERNAL_STORAGE或READ_EXTERNAL_STORAGE选项。显示“无权限被拒绝”是因为系统未单独维护这两个权限的状态,它们的权限请求被全文件访问权限覆盖。 - targetSdkVersion的影响:若应用targetSdkVersion低于30,系统会以兼容模式处理权限,但同时申请
MANAGE_EXTERNAL_STORAGE后,传统存储权限的入口会被隐藏,仅保留全文件访问的控制开关。
解决步骤
- 替换权限检查逻辑:将代码中检查
WRITE_EXTERNAL_STORAGE的代码,替换为检查全文件访问权限的逻辑。使用Environment.isExternalStorageManager()(API 30及以上)判断是否已获取MANAGE_EXTERNAL_STORAGE权限,该方法返回true即表示具备全文件读写能力。 - 移除无效的权限请求:停止调用
requestPermissions()申请WRITE_EXTERNAL_STORAGE,因为拥有全文件访问权限后,该请求不仅无效,还会导致错误提示。 - 修正adb调试操作:之前的
appops set --uid myApp.xvfmusic WRITE_EXTERNAL_STORAGE allow命令无效,因为系统在应用拥有全文件访问权限时,不会处理WRITE_EXTERNAL_STORAGE的appops设置。如需调试,可直接通过应用设置中的“所有文件访问权限”开关控制,或针对MANAGE_EXTERNAL_STORAGE进行操作。
内容的提问来源于stack exchange,提问作者Luis A. Florit
相关产品推荐
相关产品推荐

