Expo React Native 适配 Android 11 作用域存储 如何使用 expo-image-picker
Android端ImagePicker合规调整方案
1. 是否需要调整现有ImagePicker的调用API?
- 核心调用逻辑完全不需要改动,你之前使用的
requestMediaLibraryPermissionsAsync、requestCameraPermissionsAsync、launchImageLibraryAsync、launchCameraAsync这套API在适配Android 11+的新版本中完全兼容。 - 你之前写的
requestMediaLibraryPermissionsAsync也不需要删除,新版本会自动适配系统Photo Picker的权限逻辑,调用时会直接返回合法的权限状态,不会向用户申请冗余的存储权限。 - 唯一需要做的是把
expo-image-picker升级到适配Android 11+的版本(对应Expo SDK 45及以上的配套版本):旧版本的expo-image-picker依赖旧存储模型,打包时会自动注入你收到通知中提到的requestLegacyExternalStorage标记,这是合规问题的根源,新版本已经全部适配Scoped Storage,不需要你手动接入Media Store或Storage Access Framework,SDK已经帮你完成封装。 - 新版本默认会优先调用Android系统自带的Photo Picker,走Google推荐的权限模型,不需要额外配置。拍照逻辑也不需要额外调整,新版调用相机拍照后,结果会直接存入应用专属的缓存目录,不需要申请公共存储的写入权限,也不会触碰其他应用的文件。
- 注意不要在
launchImageLibraryAsync或launchCameraAsync里加legacy: true参数,这个参数会强制启用旧的存储逻辑,触发合规问题,默认不加就是走新的合规逻辑。
2. app.json的权限数组要怎么调整?
针对你仅需选图、拍照的场景,按照以下规则增减即可:
需要删除的权限
- 删除
CAMERA_ROLL:这是Expo旧版本的废弃权限别名,新版本已经不再识别,系统会根据你调用的API自动处理权限申请逻辑。 - 删除
READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE:你的场景完全不需要公共存储的读写权限,Scoped Storage下通过系统Photo Picker拿到的图片、拍照生成的文件,应用都有合法的访问权限,申请这两个旧权限反而会触发谷歌的合规检测。 - 不要添加
MANAGE_EXTERNAL_STORAGE权限:你的场景没有合法的全文件访问需求,申请该权限会直接被谷歌下架。 - 如果你的应用其他功能不需要定位的话,直接删掉
LOCATION权限即可,和本次合规问题无关。
可以保留的权限
- 保留
CAMERA权限:这是调用相机拍照的必需权限,没有合规风险。
不需要新增的权限
- 不需要加
READ_MEDIA_IMAGES、READ_MEDIA_VIDEO这类Android 13的媒体权限:因为你用的是系统Photo Picker模式,不需要提前申请媒体库的遍历权限,只有当你要自己开发自定义相册、遍历全部媒体文件时才需要添加,你的场景完全不需要。
合规验证步骤
- 升级依赖并调整配置后,打包新的aab/apk文件,解压后查看AndroidManifest.xml文件,确认没有
requestLegacyExternalStorage标记,就完全符合谷歌的要求。 - 你的场景完全匹配谷歌通知中的第1种合规方案,不需要选择全文件访问的申报路径。
内容的提问来源于stack exchange,提问作者Habibur Rahman
相关产品推荐
相关产品推荐

