原先写了块手动存入图片的代码 支持了jpg和gif等图片 在android10 12 等设备上进行存储正常
近期把app模块升级到target30 发现存储图片的功能在android12设备上会报错 且在android 10 等低版本设备上是正常的 报错如下:
E/MediaProvider: insertFileIfNecessary failed
java.lang.IllegalArgumentException: Primary directory jxImage not allowed for content://media/external_primary/file; allowed directories are [Download, Documents]
E/jiaxin: [127217086] copyFile Exception error
java.io.FileNotFoundException: /storage/emulated/0/jxImage/jx1670378666832.gif: open failed: EPERM (Operation not permitted)
at libcore.io.IoBridge.open(IoBridge.java:575)
一下子就觉得是分区存储的问题 因为原先29是android12也是正常的 尝试了一会修改路径 发现无果 后面将代码复原后 尝试认真看了下日志 wooo~ 好像是属于权限的锅 原来我漏看了这句
insertFileIfNecessary failed
查呀查资料 最后发现android11对于存储权限 有新增 且只有当有MANAGE_EXTERNAL_STORAGE这个权限时才能够正常存入图片 截图来自 Android 11 上的文件读写权限(MANAGE_EXTERNAL_STORAGE)
立马copy实践了下 咦还是没法通过存储权限 (难道单纯使用权限是错误的么) 查(继续百度) 让我查到了个端倪 这个权限并非在设置app权限的地方开启 需要跳转到指定页面手动开启 wooo~
原来如此 再来操作 试行直接跳转 授予权限 存储成功了 识图跳转且不授予权限 失败了 至此问题解决 且未授予上述说的MANAGE_EXTERNAL_STORAGE权限也能正常存入 所以关键还是得进行危险权限 读取图片的权限 (但这个权限很危险 因为一个开发者看到这权限都得犹豫几下子 真不知道这MIUI的提示为啥要这么吓人)
最终问题解决啦 哦吼忘了贴跳转代码了 补上 当然加个弹窗包含 给予用户足够的提示
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
这篇文章指导了适配 真的值得看看 Android 11 存储权限适配指南
目前对于这些锅 我都丢给了此权限 如果各位大佬有其他想法 欢迎指导哈 那么滩友们 say goodbye 啦 记得点赞哈