You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:16:14