You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何替换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参数

如果你的业务有批量操作公共媒体文件的需求,可使用MediaStoreAPI查询获取对应文件的Uri后,同样通过流的方式完成读写操作即可符合平台规范。

内容的提问来源于stack exchange,提问作者Slava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 07:30:03