React Native 0.74在Android API33+中WRITE_EXTERNAL_STORAGE权限失效
React Native 0.74 在 Android 13+ 中解决外部存储写入权限问题
问题根源
Android 13(API 33+)彻底废弃了WRITE_EXTERNAL_STORAGE权限,系统不再处理该权限的请求弹窗,直接默认"已拒绝",这就是你看不到权限弹窗、文件操作失败的原因。低版本Android(API 32及以下)仍支持该权限,所以之前的代码能正常工作。
解决方案
根据你的文件操作场景,分两种情况处理:
1. 仅操作媒体文件(图片/视频/音频)
Android 13+ 将媒体权限拆分,无需再请求WRITE_EXTERNAL_STORAGE,直接申请对应类型的媒体权限即可。
步骤1:更新AndroidManifest.xml
<!-- 仅对Android 32及以下版本保留旧权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- 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" />
步骤2:修改权限请求代码
import { request, PERMISSIONS, RESULTS } from 'react-native-permissions'; import { Alert, Linking, Platform } from 'react-native'; const requestStoragePermissions = async () => { let isGranted = false; if (Platform.OS === 'android') { if (Platform.Version >= 33) { // 以图片为例,根据你的业务替换成对应媒体权限 const mediaPermissionResult = await request(PERMISSIONS.ANDROID.READ_MEDIA_IMAGES); isGranted = mediaPermissionResult === RESULTS.GRANTED; } else { // 低版本仍使用旧权限逻辑 const writePermissionResult = await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE); isGranted = writePermissionResult === RESULTS.GRANTED; } } if (!isGranted) { Alert.alert( '权限被拒绝', '应用需要存储权限才能正常工作,请在设置中开启对应权限。', [{ text: '去设置', onPress: () => Linking.openSettings() }], { cancelable: false } ); return false; } return true; };
2. 需要访问公共目录(如Downloads、Documents)
如果你的应用需要读写非媒体类公共文件,需申请MANAGE_EXTERNAL_STORAGE特殊权限(注意:Google Play对该权限的审核严格,仅文件管理器类应用建议使用)。
步骤1:更新AndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- 添加特殊权限 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
步骤2:修改权限请求代码
import { request, PERMISSIONS, RESULTS } from 'react-native-permissions'; import { Alert, Linking, Platform } from 'react-native'; const requestStoragePermissions = async () => { let isGranted = false; if (Platform.OS === 'android') { if (Platform.Version >= 33) { const managePermissionResult = await request(PERMISSIONS.ANDROID.MANAGE_EXTERNAL_STORAGE); if (managePermissionResult === RESULTS.DENIED) { Alert.alert( '需要存储权限', '应用需要访问公共存储的权限,请在设置中开启"允许管理所有文件"。', [{ text: '去设置', onPress: () => Linking.openSettings() }], { cancelable: false } ); return false; } isGranted = managePermissionResult === RESULTS.GRANTED; } else { const writePermissionResult = await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE); isGranted = writePermissionResult === RESULTS.GRANTED; } } return isGranted; };
注意事项
- 确保
react-native-permissions是最新版本,已支持Android 13的权限常量。 - 优先使用媒体权限而非
MANAGE_EXTERNAL_STORAGE,避免Google Play审核被拒。 - 测试时务必用真实设备,模拟器的权限模拟可能存在偏差。
内容的提问来源于stack exchange,提问作者Swalih Muhammed
相关产品推荐
相关产品推荐

