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
相关产品推荐
相关产品推荐

