Android11 处理文件 出现 open failed: EACCES (Permission denied) 问题

问题原因:

Android Q 引入了分区存储的概念
官方解释:以 Android 10(API 级别 29)及更高版本为目标平台的应用
默认情况下被赋予了对外部存储空间的分区访问权限(即分区存储)

分析:

分区存储改变了应用在设备的外部存储设备中存储和访问文件的方式。
虽然Android 为对外部存储空间的读写访问定义了以下权限:
READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE。
但是对启用了分区存储方式的平台,访问外部存储也受到了限制。

解决:

Android 10(API 级别 29)为目标平台,请停用分区存储,继续使用适用于 Android 9 及更低版本的方法来执行此操作。
在清单文件 application节点内添加 requestLegacyExternalStorage属性

android:requestLegacyExternalStorage="true"

Android 11 (API 级别 30)为目标平台后,会强制执行分区存储,系统会忽略 requestLegacyExternalStorage 标记。并且WRITE_EXTERNAL_STORAGE 权限和 WRITE_MEDIA_STORAGE 特许权限将不再提供任何其他访问权限。
但是Android 提供了一种名为“所有文件访问权限”的特殊应用访问权限。在我们的清单文件内添加权限**<MANAGE_EXTERNAL_STORAGE>**
``

  <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
作用:

MANAGE_EXTERNAL_STORAGE权限授予以下访问:
1、对共享存储中的所有文件进行读写访问。
2、访问MediaStore.Files表的内容 。
3、访问USB便携式(OTG)驱动器和SD卡的根目录。
4、访问所有内部存储directories⁠,除了 /Android/data/,/sdcard/Android和大多数子目录 /sdcard/Android。

不过我们最好还是要迁移数据进行分区存储,以便更好地管理自己的文件、减少混乱。这样的话,即使在启用分区存储后,您的应用也可以继续访问这些文件。
需要注意的是从 Android 11 开始,
1、应用无法在外部存储设备上创建自己的应用专用目录。如需访问系统为您的应用提供的目录,请调用 getExternalFilesDirs()。
2、应用不能访问其他任何应用的数据目录中的文件。
3、应用无法再访问外部存储设备中的任何其他应用的专用于特定应用的目录中的文件。

详情请看:
Android 11 中的存储机制更新
Android 存储用例和最佳做法

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值