Android API 31下React Native应用照片与PDF读取权限咨询
React Native Android SDK 31:照片与PDF读取权限配置
一、核心背景
Android 12(SDK 31)重构了存储权限体系,废弃了原有的全量READ_EXTERNAL_STORAGE权限,拆分出媒体文件专属权限;非媒体文件(如PDF)则不再支持通过权限批量访问,必须依赖用户主动选择。
二、照片读取权限配置
1. 清单文件声明
在android/app/src/main/AndroidManifest.xml中添加权限:
<!-- Android 12+ 专属照片权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!-- 兼容 SDK 32 及以下版本(若需向下兼容) --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
2. 动态申请权限
React Native中用PermissionsAndroid实现动态申请:
import { PermissionsAndroid } from 'react-native'; const requestPhotoAccess = async () => { const granted = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.READ_MEDIA_IMAGES, { title: "请求照片读取权限", message: "我们需要访问你的照片来展示和读取内容", buttonPositive: "允许", buttonNegative: "取消", buttonNeutral: "稍后再说" } ); if (granted === PermissionsAndroid.RESULTS.GRANTED) { // 权限已获取,可正常读取照片 } else { // 权限被拒绝,需处理降级逻辑 } };
三、PDF文件读取方案
PDF属于非媒体文件,SDK 31及以上没有权限能让你直接批量访问所有PDF,合规的做法是使用系统文件选择器让用户主动选择文件:
使用第三方库实现文件选择
推荐用react-native-document-picker,代码示例:
import DocumentPicker from 'react-native-document-picker'; const pickPDFFile = async () => { try { const selectedFile = await DocumentPicker.pick({ type: [DocumentPicker.types.pdf], }); // 通过 selectedFile.uri 读取文件内容 console.log('选中的PDF路径:', selectedFile.uri); } catch (err) { if (DocumentPicker.isCancel(err)) { console.log('用户取消了选择'); } else { console.error('文件选择失败:', err); } } };
如果你的应用需要批量访问PDF文件夹,只能升级到SDK 33(Android 13)及以上,使用READ_MEDIA_VISUAL_USER_SELECTED权限,但仍需用户主动选择目标文件夹。
四、关于当前无权限访问的问题
你现在无需权限就能访问所有内容,大概率是测试设备的定制ROM放宽了权限限制,或者应用使用了旧的权限兼容逻辑。但这种情况不符合Android官方权限规范,会导致应用在Google Play审核时被拒,务必按上述方式调整权限配置。
内容的提问来源于stack exchange,提问作者Puja
相关产品推荐
相关产品推荐

