Android 14选择「选取照片和视频」时存储权限被拒问题求助
Android 14 「选取照片和视频」权限下存储权限返回拒绝的解决方案
问题原因
Android 14 对媒体权限进行了细分,「选取照片和视频」属于READ_MEDIA_IMAGES和READ_MEDIA_VIDEOS权限范畴,传统的READ_EXTERNAL_STORAGE存储权限在这种细分权限模式下会被系统判定为拒绝状态——因为Android 14不再通过存储权限管控媒体文件访问,而是采用更精细化的媒体权限体系。
具体解决步骤
- 调整权限申请逻辑:使用
react-native-permissions申请对应的细分媒体权限,而非存储权限。目标权限为PERMISSIONS.ANDROID.READ_MEDIA_IMAGES和PERMISSIONS.ANDROID.READ_MEDIA_VIDEOS。 - 更新AndroidManifest.xml:替换原有存储权限声明,添加细分媒体权限:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEOS" />
- 适配react-native-image-crop-picker:
- 升级库到最新稳定版本,确保其支持Android 14媒体权限机制。
- 调用选择器前,检查细分媒体权限状态而非存储权限,示例代码:
import { check, request, PERMISSIONS } from 'react-native-permissions'; import ImagePicker from 'react-native-image-crop-picker'; const pickMedia = async () => { // 检查图片和视频权限 const [imagePerm, videoPerm] = await Promise.all([ check(PERMISSIONS.ANDROID.READ_MEDIA_IMAGES), check(PERMISSIONS.ANDROID.READ_MEDIA_VIDEOS) ]); // 权限未授予则申请 if (imagePerm !== 'granted' || videoPerm !== 'granted') { const result = await request([ PERMISSIONS.ANDROID.READ_MEDIA_IMAGES, PERMISSIONS.ANDROID.READ_MEDIA_VIDEOS ]); // 处理申请结果,比如用户拒绝则提示 if (result[PERMISSIONS.ANDROID.READ_MEDIA_IMAGES] !== 'granted') { return; } } // 权限通过后打开选择器 try { const media = await ImagePicker.openPicker({ mediaType: 'any', // 根据需求选photo/video/any // 其他配置项 }); // 处理选中的媒体文件 } catch (error) { // 处理错误 } };
- 关键注意点:Android 14中,用户授予「选取照片和视频」权限时,系统不会返回
READ_EXTERNAL_STORAGE的授权状态,因此必须完全切换到细分媒体权限的检查逻辑,不要再依赖存储权限的返回结果。
内容的提问来源于stack exchange,提问作者Adnan Ashraf
相关产品推荐
相关产品推荐

