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

Android 11(SDK 30)存储适配方案 React Native相关存储库如何使用?

Android API 30 下 React Native 存储库适配方案

适配核心背景

Android 11(API 30)开始彻底废弃了requestLegacyExternalStorage过渡方案,强制采用分区存储机制,应用默认只能访问自身私有目录,访问公共目录、其他应用文件需要申请特殊权限,这是原有存储库失效的核心原因。


1. 基础配置修改

  • 打开android/app/src/main/AndroidManifest.xml,根据业务需求添加权限:
    • 仅读写应用私有文件:无需额外添加权限,所有版本通用
    • 需要访问公共目录(相册、下载、文档等):添加权限声明
      <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
      

      注意:MANAGE_EXTERNAL_STORAGE属于Google Play敏感权限,上架时需要提交使用场景说明,非必要不建议申请。

  • 确认android/build.gradle中compileSdkVersion和targetSdkVersion均设置为30及以上。

2. 主流存储库适配方案

2.1 react-native-fs 适配

  • 优先升级到2.20.0及以上版本,旧版本未适配分区存储规则
  • 非公共文件统一存储到应用私有目录,调用RNFS.DocumentDirectoryPath获取路径,无需权限即可读写,SDK 30下完全兼容
  • 确需访问公共目录的场景:先通过react-native-permissions动态申请MANAGE_EXTERNAL_STORAGE权限,权限通过后再调用RNFS.DownloadDirectoryPath、RNFS.PicturesDirectoryPath等公共目录路径执行读写操作

2.2 react-native-fetch-blob 适配

  • 该库已停止维护多年,优先替换为其官方维护分支react-native-blob-util,兼容原有API,原生层已经完成API 30+适配,仅需替换包名引用即可正常使用
  • 若保留原库使用,需做以下调整:
    • 非公共文件存储到RNFetchBlob.fs.dirs.DocumentDir私有目录,无需额外权限
    • 存储到公共目录的文件,写入完成后需要调用系统媒体扫描接口同步到公共媒体库,示例代码如下:
      RNFetchBlob.config({
        fileCache: true,
        appendExt: 'pdf',
        path: `${RNFetchBlob.fs.dirs.DownloadDir}/测试文件.pdf`
      })
      .fetch('GET', '你的文件下载地址')
      .then(res => {
        // 同步到公共媒体库,同时可以调用系统打开预览
        RNFetchBlob.android.actionViewIntent(res.path(), 'application/pdf')
      })
      

3. 通用适配注意事项

  • 不要硬编码/sdcard、/storage/emulated/0这类绝对路径,所有存储路径必须通过存储库提供的API动态获取
  • 可根据设备系统版本做向下兼容:API 29及以下仍可使用requestLegacyExternalStorage逻辑,API 30+走分区存储逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:18:04