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

React Native Android应用存储权限请求失败问题(2024年8月)

问题解决:React Native Android存储权限请求不弹窗直接返回never_ask_again

核心原因

你的问题源于Android 13(API 33)+的存储权限模型变更:WRITE_EXTERNAL_STORAGE权限已被完全废弃,系统不会再为该权限弹出请求窗口,直接返回never_ask_again状态。而React Native 0.73.4默认Target SDK为33,正好匹配你使用的Pixel 7模拟器系统版本。

解决方案

1. 更新AndroidManifest.xml权限配置

替换旧的存储权限为Android 13+适配的媒体权限,同时兼容低版本:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  <!-- 适配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" /> -->

  <!-- 兼容Android 12及以下版本的存储权限 -->
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />

  <!-- 原有应用配置保持不变 -->
  <application ...>
    ...
  </application>
</manifest>

2. 修正权限请求代码

根据Android版本动态请求对应权限,不再请求已废弃的WRITE_EXTERNAL_STORAGE:

const requestStoragePermission = async () => {
  if (Platform.OS === 'android') {
    try {
      let targetPermission;
      // Android 13+(API 33)请求媒体图片权限
      if (Platform.Version >= 33) {
        targetPermission = PermissionsAndroid.PERMISSIONS.READ_MEDIA_IMAGES;
      } else {
        // 低版本请求读存储权限
        targetPermission = PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE;
      }

      const granted = await PermissionsAndroid.request(
        targetPermission,
        {
          title: '存储权限',
          message: '应用需要访问您的存储以上传图片',
          buttonNeutral: '稍后询问',
          buttonNegative: '取消',
          buttonPositive: '确定',
        },
      );
      console.log(`权限结果... ${granted}`);
      return granted === PermissionsAndroid.RESULTS.GRANTED;
    } catch (err) {
      console.warn(err);
      return false;
    }
  } else {
    return true; // iOS无需此权限
  }
};

3. 重置模拟器权限状态

部分模拟器可能预设了权限状态,手动重置:

  • 打开模拟器设置 → 应用 → 你的应用 → 权限
  • 找到存储/媒体权限,将状态改为"询问"
  • 清除应用数据并重启应用

4. 额外检查

  • 确认模拟器系统版本为Android 13+(API 33),与你的Target SDK匹配
  • 执行cd android && ./gradlew clean清理项目缓存后重新编译

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:40:18