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

Flutter用flutter_pdfview加载800页PDF遇权限拒绝错误求助

解决Flutter加载PDF时的权限拒绝问题

问题根源分析

你当前的代码是把Asset里的PDF复制到应用私有目录(getApplicationDocumentsDirectory()),这个目录属于应用专属存储区域,不需要申请外部存储权限,你额外请求的READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE完全多余,反而可能因为权限授权逻辑阻塞了文件复制流程。另外你提供的AndroidManifest.xml中application标签未闭合,也可能导致配置失效。


具体修复步骤

1. 清理不必要的权限配置

修改AndroidManifest.xml,移除外部存储权限,确保标签完整闭合:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <application
        android:requestLegacyExternalStorage="true"
        android:label="你的应用名称"
        android:icon="@mipmap/ic_launcher">
        <!-- 这里保留你的Activity等配置 -->
    </application>
</manifest>

2. 简化权限与文件加载逻辑

因为不需要外部存储权限,直接去掉多余的权限请求代码,改为直接加载文件:

// 移除原checkStoragePermission方法,替换为这个直接加载的方法
void loadPdfFromAsset() async {
  try {
    File pdfFile = await fromAsset('assets/pdf/book.pdf', 'myBook.pdf');
    // 验证文件是否成功写入
    if (await pdfFile.exists()) {
      setState(() {
        pathPDF = pdfFile.path;
        isPermitted = true;
      });
    } else {
      print('PDF文件写入失败');
    }
  } catch (e) {
    print('加载Asset文件出错: $e');
  }
}

3. 保留原文件复制方法(无需修改)

你的fromAsset方法逻辑是正确的,继续使用即可:

Future<File> fromAsset(String asset, String filename) async {
  Completer<File> completer = Completer();

  try {
    var dir = await getApplicationDocumentsDirectory();
    File file = File("${dir.path}/$filename");
    var data = await rootBundle.load(asset);
    var bytes = data.buffer.asUint8List();
    await file.writeAsBytes(bytes, flush: true);
    completer.complete(file);
  } catch (e) {
    throw Exception('Error parsing asset file!');
  }

  return completer.future;
}

额外验证建议

  • 调用loadPdfFromAsset时,先打印dir.path确认私有目录路径,手动检查该路径下是否生成了myBook.pdf文件
  • 对于800页的大PDF,可添加进度监听或增加写入超时时间,避免因文件过大导致写入中断

内容的提问来源于stack exchange,提问作者Dilo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:52:51