前言
前几天上线的项目 这几天在疯狂修改问题
其中一个问题 引人注目 需要记录一下解决过程一来 加深记忆
二来 帮助有需要的人
问题:open failed: EACCES (Permission denied)
项目中一个用到头像剪切的地方
是打开手机相册 将图片带到剪切板 进行剪切后设置为客户头像
我自己的手机(Android 9.0
)在使用的过程中没有问题!
但是上线以后 有客户反馈 他的手机在设置头像的时候打开图片后显示一片灰色空白
当时没有考虑到是版本的问题 以为是兼容出了问题
刚好公司同事有Android10.0
的手机打开后就是灰白色
于是,开始排查版本问题 权限是否没有给到位
几番查阅资料后 找到问题 并 成功解决
问题原因
Android Q文件存储机制修改成了沙盒模式
APP只能访问自己目录下的文件和公共媒体文件。
对于AndroidQ以下,还是使用老的文件存储方式。
Android Q仍然使用READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE
作为存储相关运行时权限,但现在即使获取了这些权限,访问外部存储也受到了限制。
AndroidQ 问题解决
在Android 版本 targetSdkVersion 29以后
打开AndroidManifest.xml
文件
找到<application 标签 在此标签中加一行代码 就可以了
android:requestLegacyExternalStorage="true"
此行代码意思为:使用旧的存储策略,不使用androidQ的新策略。但这个不是长久之计,很快将会强制都使用新策略。
其他解决方法:
在Android 版本 targetSdkVersion 29以后
- 1.需要长期保存并且卸载也不能删除的,使用公有目录
公有目录:Downloads、Documents、Pictures 、DCIM、Movies、Music、Ringtones等
地址:/storage/emulated/0/Downloads(Pictures)
公有目录下的文件不会跟随APP卸载而删除。 - 2.不需要长期保存的,并且涉及安全问题的,使用私有目录
APP私有目录
地址:/storage/emulated/0/Android/data/包名/files