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

