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
相关产品推荐
相关产品推荐

