如何替换requestLegacyExternalStorage以适配谷歌要求实现用户文件复制
适配分区存储的替代方案
问题根因
Android 10(API 29)开始默认启用分区存储机制,即便应用已申请READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE权限,也无法直接通过File API 访问公共存储目录(如Download、系统相册)下其他应用创建的文件,这就是你拿到EACCES权限错误的核心原因。requestLegacyExternalStorage只是谷歌提供的临时过渡兼容方案,Android 11及以上系统已自动失效,不符合谷歌上架要求。
具体适配步骤
- 调整选图逻辑,不要获取文件绝对路径
用户选择图片时,无论通过系统相册选择器还是第三方选图框架,都不要获取公共存储的原始文件路径,只需获取选图返回的content://格式的Uri即可。 - 用ContentResolver读取流完成文件复制
拿到目标图片的Uri后,通过系统ContentResolver打开输入流,直接写入你应用私有目录下的头像文件即可,私有目录读写无需额外权限,示例代码如下:// selectedImageUri为选图返回的content类型Uri contentResolver.openInputStream(selectedImageUri)?.use { inputStream -> FileOutputStream(userProfileImage).use { outputStream -> inputStream.copyTo(outputStream) } } - 权限申请规则调整
- Android 13及以上:仅需申请
READ_MEDIA_IMAGES权限即可访问公共相册图片 - Android 10~12:仅需申请
READ_EXTERNAL_STORAGE权限即可 - 所有版本无需申请
WRITE_EXTERNAL_STORAGE权限,也无需配置requestLegacyExternalStorage参数
- Android 13及以上:仅需申请
如果你的业务有批量操作公共媒体文件的需求,可使用MediaStoreAPI查询获取对应文件的Uri后,同样通过流的方式完成读写操作即可符合平台规范。
内容的提问来源于stack exchange,提问作者Slava
相关产品推荐
相关产品推荐

