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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:54:54