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

React Native目标SDK设为30后Android 11无法使用react-native-fs执行文件操作怎么办

适配方案

1. AndroidManifest.xml 权限配置

在安卓项目的AndroidManifest.xml文件中按如下规则配置权限:

  • <manifest>节点下新增/修改权限声明:
<!-- 保留原有读写权限,写入权限仅生效到Android 10 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
<!-- 仅当需要访问公共存储全量文件时添加该权限 -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
  • <application>节点保留原有android:requestLegacyExternalStorage="true"配置,该配置用于兼容Android 10设备,不影响Android 11运行。

2. 优先使用应用私有目录

Android 11上应用私有目录无需申请任何存储权限即可正常读写,是官方推荐的适配方案:

  • 所有文件操作优先放在react-native-fs提供的私有目录常量下执行,原有API逻辑无需修改即可正常运行:
    • RNFS.DocumentDirectoryPath:应用内部存储文档目录,卸载应用时数据会被清空
    • RNFS.CachesDirectoryPath:应用内部缓存目录,系统存储空间不足时可能被自动清理
    • RNFS.ExternalDirectoryPath:应用外部存储私有目录,对用户可见,卸载应用时数据会被清空

注意:如果业务不需要将文件暴露给其他应用或者用户在系统文件管理器中独立查看,全部文件操作放在私有目录即可,不需要申请额外权限。

3. 公共目录访问适配

如果业务确实需要读写公共存储的图片、下载、文档等目录,按如下步骤操作:

  1. 搭配react-native-permissions库申请PERMISSIONS.ANDROID.MANAGE_EXTERNAL_STORAGE权限,引导用户在系统设置中开启「允许管理所有文件」权限
  2. 权限申请通过后,即可正常调用react-native-fs的API操作公共目录路径,可直接使用以下内置常量定位公共目录:
    • RNFS.DownloadDirectoryPath:公共下载目录
    • RNFS.PicturesDirectoryPath:公共图片目录
    • RNFS.MoviesDirectoryPath:公共视频目录

注意:MANAGE_EXTERNAL_STORAGE属于敏感权限,若需上架Google Play,需要向平台说明使用该权限的合理业务场景,否则可能被驳回上架申请。

4. react-native-fs 兼容调整

你当前使用的2.11.17版本对Android 11适配存在缺陷,可选择以下任意一种方式修复:

  • 方案一:升级react-native-fs到2.20.0及以上版本,升级后完成基础功能适配测试,适配你当前使用的0.59.5版本React Native
  • 方案二:手动修改源码,找到node_modules/react-native-fs/android/src/main/java/com/rnfs/RNFSManager.java文件,移除Android 11以上版本的路径合法性拦截逻辑,修改完成后重新打包即可

调试注意事项

  • 所有文件操作逻辑添加异常捕获,打印返回的错误码和错误信息,可快速区分是权限未授予还是路径不合法导致的操作失败
  • 避免直接拼接外部存储根路径进行文件操作,优先使用react-native-fs提供的内置路径常量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:27:03