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

Android 13升级后,React Native项目如何用READ_MEDIA_IMAGES替代READ_EXTERNAL_STORAGE?

问题解答

1. 仅在Manifest中添加权限不够,必须主动请求READ_MEDIA_IMAGES权限

Android 13对媒体权限做了细分,不再沿用旧版READ_EXTERNAL_STORAGE的自动权限请求逻辑。就算你在Manifest里声明了新的细分权限,系统也不会自动弹出权限申请弹窗,必须通过代码主动发起权限请求。

2. 具体操作步骤

(1)完善AndroidManifest.xml配置

除了添加Android 13的细分权限,为兼容Android 12及以下版本,建议同时保留旧权限(Android 13会自动忽略该配置):

<!-- Android 13+ 媒体图片权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<!-- 兼容 Android 12 及以下版本 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />

(2)通过react-native-permissions主动请求权限

你已经升级到支持细分权限的依赖版本,直接调用对应权限类型即可。建议在调用camera-roll或react-native-image-crop-picker之前,先检查并请求权限:

import { check, request, PERMISSIONS, RESULTS } from 'react-native-permissions';
import ImageCropPicker from 'react-native-image-crop-picker';

// 检查并请求图片权限
const requestImagePermission = async () => {
  const status = await check(PERMISSIONS.ANDROID.READ_MEDIA_IMAGES);
  if (status === RESULTS.GRANTED) {
    // 权限已允许,执行图片选择操作
    pickImage();
  } else if (status === RESULTS.DENIED) {
    // 首次请求权限
    const result = await request(PERMISSIONS.ANDROID.READ_MEDIA_IMAGES);
    result === RESULTS.GRANTED && pickImage();
  } else if (status === RESULTS.BLOCKED) {
    // 用户永久拒绝权限,引导至设置页
    alert('图片权限已被永久拒绝,请前往应用设置开启后重试');
  }
};

// 调用图片选择器
const pickImage = () => {
  ImageCropPicker.openPicker({
    mediaType: 'photo',
    // 其他自定义配置
  }).then(image => {
    // 处理选中的图片资源
  }).catch(err => {
    // 处理选择失败的情况
  });
};

(3)react-native-image-crop-picker的额外注意

部分新版本的react-native-image-crop-picker会在调用时自动检查权限,但为了更可控(比如提前向用户说明权限用途),还是建议主动在业务逻辑发起前请求权限,避免出现无权限导致的崩溃或异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:20:28