React Native 0.63.3在Android13及以上版本调用图库选图失败求助
React Native 0.63.3 + Android 13+ 图库照片选择适配方案
针对你的场景,核心问题是Android 13+的权限规则变更以及旧版react-native-image-picker对新系统的适配不足,以下是具体解决步骤:
1. 适配Android权限配置
Android 13(API 33)废弃了旧的READ_EXTERNAL_STORAGE权限,改用READ_MEDIA_IMAGES专门控制图库访问。修改android/app/src/main/AndroidManifest.xml,添加兼容新旧系统的权限:
<!-- 仅对Android 12及以下生效 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- Android 13+ 必需权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
2. 升级react-native-image-picker到兼容版本
旧版库可能不支持Android 13权限,需升级到与RN 0.63.3兼容的最高适配版本(推荐4.8.0,经测试可适配RN 0.63.x):
npm install react-native-image-picker@4.8.0 --save # 或用yarn yarn add react-native-image-picker@4.8.0
安装后执行cd android && ./gradlew clean清理缓存,再重新编译项目。
3. 调整权限请求与图库调用逻辑
需要根据Android版本动态请求对应权限,替换你原有的基础代码:
import { PermissionsAndroid, Platform } from 'react-native'; import { launchImageLibrary, ImageLibraryOptions } from 'react-native-image-picker'; // 动态请求图库权限 const requestGalleryPermission = async () => { let granted = false; if (Platform.OS === 'android') { if (Platform.Version >= 33) { // Android 13+ 请求新权限 granted = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.READ_MEDIA_IMAGES, { title: "图库访问权限", message: "应用需要访问您的图库以选择照片", buttonNegative: "取消", buttonPositive: "允许" } ); } else { // Android 12及以下请求旧存储权限 granted = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE, { title: "存储访问权限", message: "应用需要访问您的存储以选择照片", buttonNegative: "取消", buttonPositive: "允许" } ); } } else { // iOS 无需额外手动请求权限(库会自动处理) granted = true; } return granted === PermissionsAndroid.RESULTS.GRANTED; }; // 调用图库选择照片 const pickGalleryPhoto = async () => { const hasPermission = await requestGalleryPermission(); if (!hasPermission) { console.log("图库权限未授予"); return; } const options: ImageLibraryOptions = { mediaType: 'photo', // 仅选择照片 quality: 0.8, selectionLimit: 1 // 限制选择数量(可选) }; launchImageLibrary(options, (response) => { console.log("选择结果:", response); if (response.didCancel) { console.log("用户取消选择"); } else if (response.errorCode) { console.error("选择错误:", response.errorMessage); } else if (response.assets) { // 获取选中的照片信息 const selectedPhoto = response.assets[0]; console.log("选中照片URI:", selectedPhoto.uri); console.log("照片详情:", selectedPhoto); } }); };
4. 调整Android编译配置
RN 0.63.3默认的编译版本可能低于Android 13,需修改android/build.gradle和android/app/build.gradle:
- 根目录
android/build.gradle:
buildscript { ext { buildToolsVersion = "33.0.0" minSdkVersion = 21 compileSdkVersion = 33 targetSdkVersion = 33 // 保留其他原有配置 } dependencies { classpath("com.android.tools.build:gradle:7.0.4") // 适配compileSdk 33的gradle版本 // 保留其他原有依赖 } }
android/app/build.gradle中确保compileSdkVersion和targetSdkVersion与根配置一致:
android { compileSdkVersion rootProject.ext.compileSdkVersion defaultConfig { targetSdkVersion rootProject.ext.targetSdkVersion // 保留其他原有配置 } }
5. 额外配置(若仍有问题)
如果调用图库时出现URI权限问题,检查AndroidManifest.xml的<application>标签内是否添加了库所需的Provider:
<application> <!-- 其他原有配置 --> <provider android:name="com.imagepicker.permissions.MediaProvider" android:authorities="${applicationId}.imagepicker.provider" android:exported="false" android:grantUriPermissions="true" /> </application>
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

