React Native安卓13应用查看PDF时权限拒绝问题求助
解决React Native中用react-native-pdf打开Document Picker选择的PDF文件问题
1. 修正Android权限配置
Android 13及以上版本,PDF这类文档不需要传统的READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限,只需确保Manifest配置正确:
- 在
AndroidManifest.xml中添加以下权限:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.INTERNET" />
- 禁止请求
READ_EXTERNAL_STORAGE:Android 13+下,Document Picker返回的URI自带临时访问权限,无需额外存储权限。
2. 正确处理Document Picker返回的URI
Document Picker返回的content://类型URI,直接传递给react-native-pdf可能因权限解析问题报错,可按以下方式处理:
核心代码修正示例
import DocumentPicker from 'react-native-document-picker'; import PDFView from 'react-native-pdf'; const pickPDF = async () => { try { const result = await DocumentPicker.pick({ type: [DocumentPicker.types.pdf], mode: DocumentPicker.types.allFiles }); // 将URI标记为可缓存,避免临时权限过期 const pdfSource = { uri: result.uri, cache: true }; setPdfSource(pdfSource); } catch (err) { if (!DocumentPicker.isCancel(err)) { console.error('选择PDF错误:', err); } } }; // 渲染PDF视图 return ( <PDFView style={{ flex: 1 }} source={pdfSource} onError={(error) => console.error('PDF加载错误:', error)} /> );
3. 解决actiond_document_viewer错误
若仍报错,可通过react-native-fs将content:// URI转换为应用私有目录的本地文件路径:
- 先安装依赖:
npm install react-native-fs --save
- 修改代码:
import RNFS from 'react-native-fs'; // 在pickPDF函数中获取result后执行: const localPath = `${RNFS.DocumentDirectoryPath}/${Date.now()}.pdf`; await RNFS.copyFile(result.uri, localPath); const pdfSource = { uri: `file://${localPath}` }; setPdfSource(pdfSource);
将PDF复制到应用私有目录后,react-native-pdf可直接访问,彻底避免权限问题。
4. 验证FileProvider配置
确保AndroidManifest.xml中配置了FileProvider,用于正确处理文件URI权限:
<application ...> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> </application>
在res/xml/file_paths.xml中添加路径配置:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="files" path="." /> <external-files-path name="external_files" path="." /> </paths>
5. 测试注意事项
- 更新react-native-pdf到最新版本:
npm install react-native-pdf@latest --save
- 测试时选择不同目录的PDF文件(下载目录、文档目录等),验证兼容性。
内容的提问来源于stack exchange,提问作者Vinod Krishnan
相关产品推荐
相关产品推荐

