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

React Native 0.74在Android API33+中WRITE_EXTERNAL_STORAGE权限失效

React Native 0.74 在 Android 13+ 中解决外部存储写入权限问题

问题根源

Android 13(API 33+)彻底废弃了WRITE_EXTERNAL_STORAGE权限,系统不再处理该权限的请求弹窗,直接默认"已拒绝",这就是你看不到权限弹窗、文件操作失败的原因。低版本Android(API 32及以下)仍支持该权限,所以之前的代码能正常工作。

解决方案

根据你的文件操作场景,分两种情况处理:

1. 仅操作媒体文件(图片/视频/音频)

Android 13+ 将媒体权限拆分,无需再请求WRITE_EXTERNAL_STORAGE,直接申请对应类型的媒体权限即可。

步骤1:更新AndroidManifest.xml

<!-- 仅对Android 32及以下版本保留旧权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />

<!-- Android 13+ 媒体权限,按需选择 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

步骤2:修改权限请求代码

import { request, PERMISSIONS, RESULTS } from 'react-native-permissions';
import { Alert, Linking, Platform } from 'react-native';

const requestStoragePermissions = async () => {
  let isGranted = false;

  if (Platform.OS === 'android') {
    if (Platform.Version >= 33) {
      // 以图片为例,根据你的业务替换成对应媒体权限
      const mediaPermissionResult = await request(PERMISSIONS.ANDROID.READ_MEDIA_IMAGES);
      isGranted = mediaPermissionResult === RESULTS.GRANTED;
    } else {
      // 低版本仍使用旧权限逻辑
      const writePermissionResult = await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
      isGranted = writePermissionResult === RESULTS.GRANTED;
    }
  }

  if (!isGranted) {
    Alert.alert(
      '权限被拒绝',
      '应用需要存储权限才能正常工作,请在设置中开启对应权限。',
      [{ text: '去设置', onPress: () => Linking.openSettings() }],
      { cancelable: false }
    );
    return false;
  }
  return true;
};

2. 需要访问公共目录(如Downloads、Documents)

如果你的应用需要读写非媒体类公共文件,需申请MANAGE_EXTERNAL_STORAGE特殊权限(注意:Google Play对该权限的审核严格,仅文件管理器类应用建议使用)。

步骤1:更新AndroidManifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<!-- 添加特殊权限 -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

步骤2:修改权限请求代码

import { request, PERMISSIONS, RESULTS } from 'react-native-permissions';
import { Alert, Linking, Platform } from 'react-native';

const requestStoragePermissions = async () => {
  let isGranted = false;

  if (Platform.OS === 'android') {
    if (Platform.Version >= 33) {
      const managePermissionResult = await request(PERMISSIONS.ANDROID.MANAGE_EXTERNAL_STORAGE);
      if (managePermissionResult === RESULTS.DENIED) {
        Alert.alert(
          '需要存储权限',
          '应用需要访问公共存储的权限,请在设置中开启"允许管理所有文件"。',
          [{ text: '去设置', onPress: () => Linking.openSettings() }],
          { cancelable: false }
        );
        return false;
      }
      isGranted = managePermissionResult === RESULTS.GRANTED;
    } else {
      const writePermissionResult = await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
      isGranted = writePermissionResult === RESULTS.GRANTED;
    }
  }

  return isGranted;
};

注意事项

  • 确保react-native-permissions是最新版本,已支持Android 13的权限常量。
  • 优先使用媒体权限而非MANAGE_EXTERNAL_STORAGE,避免Google Play审核被拒。
  • 测试时务必用真实设备,模拟器的权限模拟可能存在偏差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:52:38