React Native Image Picker无法正常工作,调用Promise.reject时出现空指针异常
错误日志
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=13003, result=-1, data=Intent { dat=content://media/... flg=0x41 clip={image/* video/* {U(content)}} }}java.lang.NullPointerException: Attempt to invoke interface method 'void com.facebook.react.bridge.Promise.reject(java.lang.Throwable)' on a null object reference
我的实现代码
import {launchImageLibrary} from 'react-native-image-picker'; import AsyncStorage from "@react-native-async-storage/async-storage"; const openGallery = () => { launchImageLibrary({mediaType: "photo"}).then(response => { if (response.assets) { console.log(response) try { const image = response.assets[0]; AsyncStorage.setItem('userProfilePhoto', `${image.uri}`.toString()).then(r => { console.log('Image saved to async storage.'); }); } catch (error) { console.log(error); } } }); };
解决办法
1. 适配版本兼容性
这个空指针问题大概率是包版本和React Native版本不匹配导致的,先升级到最新稳定版:
npm install react-native-image-picker@latest # 或 yarn add react-native-image-picker@latest
2. 补全错误捕获逻辑
你的代码只处理了AsyncStorage的异常,但launchImageLibrary本身的Promise错误未被捕获,容易导致原生层Promise对象丢失。完善代码:
const openGallery = () => { launchImageLibrary({mediaType: "photo"}) .then(response => { if (response.assets) { console.log(response) try { const image = response.assets[0]; AsyncStorage.setItem('userProfilePhoto', `${image.uri}`.toString()) .then(r => console.log('图片已存入AsyncStorage')) .catch(asyncErr => console.log('存储失败:', asyncErr)); } catch (err) { console.log('图片数据处理失败:', err); } } else if (response.didCancel) { console.log('用户取消选图'); } else if (response.errorCode) { console.log('选图出错:', response.errorMessage); } }) .catch(launchErr => console.log('调用相册失败:', launchErr)); };
3. 检查Android权限配置
确保AndroidManifest.xml中添加了对应权限:
<!-- Android 12及以下读取存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Android 13+ 读取图片权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
Android 13及以上版本,需要动态申请READ_MEDIA_IMAGES权限,而非旧的存储权限。
4. 清理缓存重建项目
缓存异常也可能导致原生层代码出错,执行以下操作:
- 清理Android项目缓存:
cd android && ./gradlew clean && cd .. - 重置Metro缓存:
npx react-native start --reset-cache - 重新运行项目:
npx react-native run-android
5. 排查Bridge冲突
如果项目中存在多个原生模块,可能出现Bridge注册冲突。确认react-native-image-picker的原生配置没有重复注册模块。
内容的提问来源于stack exchange,提问作者Angelo Buse

