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

Android 11下React Native使用React Native FS无法创建文件夹如何解决

React Native Android 11 下RNFS创建文件夹失败解决方案

问题根因

Android 11(API 30)开始强制启用分区存储机制:

  • WRITE_EXTERNAL_STORAGE 权限已废弃,申请后也不会授予外部存储写入权限
  • 你代码中使用的MainBundleDir对应APK安装目录,是只读路径,不允许写入任何文件、创建文件夹

解决步骤

1. 调整Android配置

打开项目android/app/src/main/AndroidManifest.xml做如下修改:

  • 移除原有WRITE_EXTERNAL_STORAGE权限申请,如需兼容Android 10及以下版本,修改为:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
  • 在<application>标签添加临时兼容配置:
<application
  android:requestLegacyExternalStorage="true"
  ... 其他原有配置
>

2. 路径选择修正

你的业务仅需要应用内离线访问数据,优先选择应用私有存储目录,不需要申请任何存储权限即可读写,对应RNFS的RNFS.DocumentDir,路径为/data/data/[你的应用包名]/files/,完全满足离线访问需求。

3. 代码修正

RNFS.mkdir默认不会自动创建不存在的父目录,需要传入第二个参数开启递归创建,修正后的代码如下:

downloadFile = async (url) => {
  try {
    // 私有目录不需要申请存储权限,直接操作即可
    const targetDir = `${RNFS.DocumentDir}/Jharkhand Update Database`;
    // 开启intermediates自动创建多级父目录
    const execute = await RNFS.mkdir(targetDir, { intermediates: true })
    console.log('文件夹创建成功', execute, targetDir);
    // 后续下载逻辑写在这里
  } catch (err) {
    console.log('创建文件夹失败', err);
    ToastAndroid.showWithGravity(
      '存储访问失败,请检查应用权限设置',
      ToastAndroid.SHORT,
      ToastAndroid.BOTTOM,
    );
  }
};

特殊场景说明

如果你需要把下载的文件共享给其他应用、或者让用户在系统文件管理器里能看到,可以把路径改为RNFS.DownloadDir(系统公共下载目录),此时需要额外适配Android 11以上的MediaStore写入逻辑,不需要申请额外权限。


内容的提问来源于stack exchange,提问作者Md Javed Akhtar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:30:01