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

Android 11上React Native Image Picker拍照确认无响应问题求助

解决React Native Image Picker在Android 11拍照确认无响应的问题

针对你遇到的Android 11设备上拍摄照片后点击确认无响应的问题,以下是具体的解决思路和修复步骤:

1. 修复权限请求的异步逻辑问题

你的handleCameraLaunch函数中,调用requestGalleryPermission()时未使用await,导致permission变量拿到的是Promise对象而非布尔值,会直接进入相机启动逻辑,可能引发权限未正确获取时的异常。修改代码如下:

export const handleCameraLaunch = async (launchCameraEvent) => {
  const options = {
    mediaType: 'photo',
    includeBase64: true,
    maxHeight: 2000,
    maxWidth: 2000,
  };
  // 添加await等待权限请求完成
  const permission = await requestGalleryPermission();
  if (permission) {
    await launchCamera(options, response => {
      if (response.didCancel) {
        console.log('User cancelled camera');
      } else if (response.error) {
        console.log('Camera Error: ', response.error);
      } else {
        console.log('Taking photo');
        launchCameraEvent(response);
      }
    });
  }
};

2. 升级react-native-image-picker到适配Android 11的版本

旧版本的react-native-image-picker未适配Android 11的Scoped Storage机制,会导致照片保存时卡住。建议升级到最新稳定版本(v4.x及以上),执行命令:

npm install react-native-image-picker@latest
# 或 yarn add react-native-image-picker@latest

升级后同步更新Android端配置,遵循官方文档完成必要步骤。

3. 调整AndroidManifest.xml配置

针对Android 11(API 30)特性,调整权限和存储相关配置:

  • 移除WRITE_EXTERNAL_STORAGE权限(API 30及以上已废弃该权限,无需申请)
  • 保留READ_EXTERNAL_STORAGE和CAMERA权限
  • 在<application>标签中保留android:requestLegacyExternalStorage="true",确保兼容旧存储逻辑

示例配置片段:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<application
  android:name=".MainApplication"
  android:label="@string/app_name"
  android:icon="@mipmap/ic_launcher"
  android:roundIcon="@mipmap/ic_launcher_round"
  android:allowBackup="false"
  android:requestLegacyExternalStorage="true"
  android:theme="@style/AppTheme">
  <!-- 其他配置 -->
</application>

4. 优化相机启动选项

在相机配置中添加storageOptions参数,明确图片存储路径和备份设置,避免Android 11下的存储访问异常:

const options = {
  mediaType: 'photo',
  includeBase64: true,
  maxHeight: 2000,
  maxWidth: 2000,
  storageOptions: {
    skipBackup: true, // 防止图片被云备份
    path: 'images', // 指定存储到应用私有目录下的images文件夹
  },
};

关于重写onActivityResult的说明

React Native新版本已切换到ActivityResultContracts替代旧的onActivityResult机制,react-native-image-picker的新版本已适配该变化,无需手动重写。升级库版本即可解决相关兼容性问题。

内容的提问来源于stack exchange,提问作者alanders

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 17:53:22