Android 12 保存图片时公共目录存储访问异常问题
分区存储适配不到位
Android 10(API 29)起引入分区存储机制,就算申请了READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE,直接用File类操作公共目录也可能被限制。卸载重装后,系统重置了应用的存储权限状态,没适配分区存储规则的话,就容易触发open failed: EACCES (Permission denied)错误。建议改用MediaStore API来保存媒体文件,别直接硬写文件路径。权限生效有延迟
卸载重装后刚授予权限,系统可能还没同步完权限状态,要是立刻执行文件写入,就会碰权限拒绝。解决办法很简单:等权限申请成功的回调完全触发后再执行保存逻辑,或者加个权限状态检查,确认ContextCompat.checkSelfPermission返回PERMISSION_GRANTED再动手。公共目录的访问限制升级
Android 11+对Download、Pictures这类公共目录管得更严,卸载重装后应用的存储访问令牌会失效,哪怕有基础权限也直接写不了。给你个示例代码,用MediaStore存图片:ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DISPLAY_NAME, "test.jpg"); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES); Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); OutputStream outputStream = getContentResolver().openOutputStream(uri); // 这里写入图片字节数据系统权限缓存残留
有些系统卸载应用后会残留旧的权限缓存,导致新安装的应用权限状态异常。如果确认已经授予权限但还是报错,可以引导用户去应用设置里清除存储数据,再重试操作。Android 13+权限细分问题
Android 13(API 33)把存储权限拆成了READ_MEDIA_IMAGES、READ_MEDIA_VIDEO这类细分权限,要是还在申请旧的WRITE_EXTERNAL_STORAGE,卸载重装后大概率访问不了媒体目录。得根据系统版本动态申请对应权限,别一套权限走天下。
内容的提问来源于stack exchange,提问作者Nazmin Khan

