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

React Native Image Picker无法正常工作,调用Promise.reject时出现空指针异常

React Native Image Picker 相册选图时触发空指针错误

错误日志

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:45:12