React Native Android应用存储权限请求失败问题(2024年8月)
问题解决:React Native Android存储权限请求不弹窗直接返回never_ask_again
核心原因
你的问题源于Android 13(API 33)+的存储权限模型变更:WRITE_EXTERNAL_STORAGE权限已被完全废弃,系统不会再为该权限弹出请求窗口,直接返回never_ask_again状态。而React Native 0.73.4默认Target SDK为33,正好匹配你使用的Pixel 7模拟器系统版本。
解决方案
1. 更新AndroidManifest.xml权限配置
替换旧的存储权限为Android 13+适配的媒体权限,同时兼容低版本:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 适配Android 13+的图片访问权限 --> <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" /> --> <!-- 兼容Android 12及以下版本的存储权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- 原有应用配置保持不变 --> <application ...> ... </application> </manifest>
2. 修正权限请求代码
根据Android版本动态请求对应权限,不再请求已废弃的WRITE_EXTERNAL_STORAGE:
const requestStoragePermission = async () => { if (Platform.OS === 'android') { try { let targetPermission; // Android 13+(API 33)请求媒体图片权限 if (Platform.Version >= 33) { targetPermission = PermissionsAndroid.PERMISSIONS.READ_MEDIA_IMAGES; } else { // 低版本请求读存储权限 targetPermission = PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE; } const granted = await PermissionsAndroid.request( targetPermission, { title: '存储权限', message: '应用需要访问您的存储以上传图片', buttonNeutral: '稍后询问', buttonNegative: '取消', buttonPositive: '确定', }, ); console.log(`权限结果... ${granted}`); return granted === PermissionsAndroid.RESULTS.GRANTED; } catch (err) { console.warn(err); return false; } } else { return true; // iOS无需此权限 } };
3. 重置模拟器权限状态
部分模拟器可能预设了权限状态,手动重置:
- 打开模拟器设置 → 应用 → 你的应用 → 权限
- 找到存储/媒体权限,将状态改为"询问"
- 清除应用数据并重启应用
4. 额外检查
- 确认模拟器系统版本为Android 13+(API 33),与你的Target SDK匹配
- 执行
cd android && ./gradlew clean清理项目缓存后重新编译
内容的提问来源于stack exchange,提问作者Keegan White
相关产品推荐
相关产品推荐

