Android 13升级后,React Native项目如何用READ_MEDIA_IMAGES替代READ_EXTERNAL_STORAGE?
问题解答
1. 仅在Manifest中添加权限不够,必须主动请求READ_MEDIA_IMAGES权限
Android 13对媒体权限做了细分,不再沿用旧版READ_EXTERNAL_STORAGE的自动权限请求逻辑。就算你在Manifest里声明了新的细分权限,系统也不会自动弹出权限申请弹窗,必须通过代码主动发起权限请求。
2. 具体操作步骤
(1)完善AndroidManifest.xml配置
除了添加Android 13的细分权限,为兼容Android 12及以下版本,建议同时保留旧权限(Android 13会自动忽略该配置):
<!-- Android 13+ 媒体图片权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!-- 兼容 Android 12 及以下版本 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
(2)通过react-native-permissions主动请求权限
你已经升级到支持细分权限的依赖版本,直接调用对应权限类型即可。建议在调用camera-roll或react-native-image-crop-picker之前,先检查并请求权限:
import { check, request, PERMISSIONS, RESULTS } from 'react-native-permissions'; import ImageCropPicker from 'react-native-image-crop-picker'; // 检查并请求图片权限 const requestImagePermission = async () => { const status = await check(PERMISSIONS.ANDROID.READ_MEDIA_IMAGES); if (status === RESULTS.GRANTED) { // 权限已允许,执行图片选择操作 pickImage(); } else if (status === RESULTS.DENIED) { // 首次请求权限 const result = await request(PERMISSIONS.ANDROID.READ_MEDIA_IMAGES); result === RESULTS.GRANTED && pickImage(); } else if (status === RESULTS.BLOCKED) { // 用户永久拒绝权限,引导至设置页 alert('图片权限已被永久拒绝,请前往应用设置开启后重试'); } }; // 调用图片选择器 const pickImage = () => { ImageCropPicker.openPicker({ mediaType: 'photo', // 其他自定义配置 }).then(image => { // 处理选中的图片资源 }).catch(err => { // 处理选择失败的情况 }); };
(3)react-native-image-crop-picker的额外注意
部分新版本的react-native-image-crop-picker会在调用时自动检查权限,但为了更可控(比如提前向用户说明权限用途),还是建议主动在业务逻辑发起前请求权限,避免出现无权限导致的崩溃或异常。
内容的提问来源于stack exchange,提问作者Mona Singh
相关产品推荐
相关产品推荐

