React Native中PermissionAndroid.request始终返回never_ask_again无弹窗求助
解决Android 13(targetSDK 33)中WRITE_EXTERNAL_STORAGE权限请求无弹窗且返回never_ask_again的问题
核心原因
Android 13(API 33)彻底废弃了WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE权限,改用细分的媒体权限管理,同时非媒体文件的写入无需申请权限,直接通过系统API或应用专属目录操作即可。
具体解决方案
1. 更新权限请求代码
根据业务需求替换为对应媒体权限,若仅需下载文件,无需申请存储权限,直接使用MediaStore或应用专属目录即可。以下是访问图片媒体的示例代码:
try { const granted = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.READ_MEDIA_IMAGES, { title: '媒体存储读取权限', message: '应用需要访问图片权限', }, ); console.log(granted); if (granted === PermissionsAndroid.RESULTS.GRANTED) { downloadFile(); console.log('存储权限已授予'); } else { Alert.alert('错误', '存储权限未授予'); } } catch (err) { console.log('++++' + err); }
2. 修改AndroidManifest.xml配置
移除废弃的存储权限,按需添加媒体权限:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 按需添加媒体权限 --> <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" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="android.permission.CAMERA"/> <application android:name=".MainApplication" android:usesCleartextTraffic="true" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="false" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <action android:name="android.intent.action.DOWNLOAD_COMPLETE"/> </intent-filter> </activity> </application> </manifest>
3. 文件下载的权限替代方案
- 若下载到应用专属目录(
/Android/data/你的包名/):直接写入即可,无需任何权限。 - 若下载到公共媒体目录(如相册、视频文件夹):使用
MediaStoreAPI写入,无需申请存储权限。
内容的提问来源于stack exchange,提问作者d3f4u1t3d
相关产品推荐
相关产品推荐

