React Native Android平台WRITE_EXTERNAL_STORAGE权限始终被阻止问题排查
解决React Native在Android 13下存储权限请求失败的问题
问题原因
Android 13(API 33)对存储权限机制做了重大调整:WRITE_EXTERNAL_STORAGE权限已被完全废弃,系统不再识别该权限的申请请求,也不会向用户展示这个权限选项。这就是你遇到权限不弹窗、请求返回blocked的核心原因。
解决方案
1. 替换AndroidManifest.xml中的权限
根据你实际需要访问的媒体类型,替换成Android 13对应的新权限:
<!-- 示例:如果需要访问/写入图片 --> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.WRITE_MEDIA_IMAGES" /> <!-- 如果需要访问视频/音频,添加对应权限 --> <!-- <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> --> <!-- <uses-permission android:name="android.permission.WRITE_MEDIA_VIDEO" /> -->
同时移除无效的requestLegacyExternalStorage配置(仅对Android 10/11生效,Android 13已强制分区存储):
<application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher" android:allowBackup="true" android:theme="@style/AppTheme" > ... </application>
2. 调整JS端权限请求逻辑
在react-native-permissions中,使用对应新权限的常量替代WRITE_EXTERNAL_STORAGE:
// 修改权限类型为对应媒体权限,比如图片权限 async checkPermission() { const permission = Platform.select({ android: PERMISSIONS.ANDROID.READ_MEDIA_IMAGES, }); const response = await request(permission); if (response !== 'authorized') { this.requestPermissions(); } } async requestPermissions() { const permission = Platform.select({ android: PERMISSIONS.ANDROID.READ_MEDIA_IMAGES, }); const response = await request(permission); if (['restricted', 'blocked', 'never_ask_again'].includes(response)) { // 处理权限被拒绝的逻辑 } }
3. 额外说明
- 如果你的需求是读写应用私有目录(比如
getFilesDir()、getCacheDir()下的文件),不需要申请任何存储权限,直接读写即可。 - 若需要访问公共下载目录等非媒体文件,Android 13可以使用
MANAGE_EXTERNAL_STORAGE权限,但这个权限需要在Google Play审核时说明用途,且仅适用于特殊场景(比如文件管理器类应用)。
内容的提问来源于stack exchange,提问作者Neha Soni
相关产品推荐
相关产品推荐

