React Native安卓升级API Level33后WRITE_EXTERNAL_STORAGE权限被拒求助
解决React Native升级Target API 33后WRITE_EXTERNAL_STORAGE权限被拒问题
1. 先搞懂API 33的权限变更
Android 13(对应API 33)彻底废弃了WRITE_EXTERNAL_STORAGE权限,把存储权限拆分成了媒体类型专属权限。现在不再通过这个旧权限申请存储读写,而是根据你操作的媒体类型,申请对应的细分权限。
2. 更新AndroidManifest.xml配置
- 移除旧的
WRITE_EXTERNAL_STORAGE权限,替换为API 33要求的媒体权限:<!-- 删掉这行旧权限 --> <!-- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> --> <!-- 根据你的业务需求添加对应权限,比如操作图片就加下面这个 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!-- 操作视频加这个 --> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <!-- 操作音频加这个 --> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> - 注意:API 33+下,写入媒体文件(比如保存图片到相册)不需要单独申请WRITE权限,直接通过
MediaStoreAPI写入即可,系统会自动授权。
3. 调整React Native的权限请求逻辑
如果你的代码里还在请求WRITE_EXTERNAL_STORAGE,要改成请求对应的媒体权限。以react-native-permissions库为例:
import { Platform } from 'react-native'; import { PERMISSIONS, request } from 'react-native-permissions'; // 根据Android版本动态选择要请求的权限 const getTargetPermission = () => { if (Platform.Version >= 33) { // API33+请求媒体权限,这里以图片为例 return PERMISSIONS.ANDROID.READ_MEDIA_IMAGES; } else { // 低版本还是用旧权限 return PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE; } }; // 发起权限请求 const requestStoragePermission = async () => { const result = await request(getTargetPermission()); // 处理权限结果 };
4. 兼容低版本Android
如果要同时支持API 32及以下设备,可以给旧权限加上版本限制:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
这样低版本设备能正常使用旧权限,API 33+设备会自动忽略这行配置。
5. 检查第三方库的权限依赖
有些第三方库可能还在默认引入WRITE_EXTERNAL_STORAGE权限,导致冲突。可以在AndroidManifest.xml中强制移除重复权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="remove" />
同时建议把第三方库更新到支持API 33的最新版本。
内容的提问来源于stack exchange,提问作者Robert S
相关产品推荐
相关产品推荐

