使用flutter_downloader下载PDF时文件已保存但通知和控制台显示失败
解决flutter_downloader下载成功但通知/日志显示失败的问题
针对你遇到的「PDF已保存到应用目录,但通知栏显示失败、控制台输出失败日志」的问题,结合你使用的版本(flutter_downloader: ^1.11.6、permission_handler: ^11.0.1、path_provider: ^2.1.2),可以从以下几个方向排查解决:
1. 补全AndroidManifest配置细节
这类问题大概率是服务或权限配置不全导致的:
- 强制添加通知权限(Android 12+系统要求):
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> - 确认
DownloadService配置完整,不能漏写intent-filter:<service android:name="vn.hunghd.flutterdownloader.DownloadService" android:permission="android.permission.FOREGROUND_SERVICE" android:exported="false"> <intent-filter> <action android:name="vn.hunghd.flutterdownloader.action.DOWNLOAD_COMPLETE"/> <action android:name="vn.hunghd.flutterdownloader.action.UPDATE_PROGRESS"/> </intent-filter> </service> - 若下载到外部存储,需适配Android版本添加存储权限(私有目录可跳过):
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>
2. 主动申请通知权限
即使下载到应用私有目录,通知栏显示也需要POST_NOTIFICATIONS权限,在代码中提前申请:
Future<void> checkAndRequestPermissions() async { if (Platform.isAndroid) { // 申请通知权限 if (await Permission.notification.isDenied) { await Permission.notification.request(); } // 若下载到外部存储,再申请存储权限 if (await Permission.storage.isDenied) { await Permission.storage.request(); } } }
3. 检查下载路径与任务配置
- 确认
savedDir路径合法,避免包含特殊字符或权限受限的目录:final dir = await getApplicationDocumentsDirectory(); final taskId = await FlutterDownloader.enqueue( url: "你的PDF下载链接", savedDir: dir.path, showNotification: true, openFileFromNotification: true, saveInPublicStorage: false, // 私有目录设为false ); - 初始化flutter_downloader时开启调试模式,查看更详细的失败日志:
await FlutterDownloader.initialize( debug: true, // 开启后控制台会输出更多细节 ignoreSsl: false, // 若HTTPS证书有问题可临时开启 );
4. 修正回调中的状态误判
有时flutter_downloader会因为文件校验、通知创建失败等误报状态,可在回调中手动校验文件存在性:
FlutterDownloader.registerCallback((taskId, status, progress) async { // 根据taskId获取文件路径 final tasks = await FlutterDownloader.loadTasksWithRawQuery(query: "SELECT * FROM task WHERE task_id = '$taskId'"); if (tasks?.isNotEmpty == true) { final file = File(tasks!.first.savedDir! + "/" + tasks.first.filename!); if (status == DownloadTaskStatus.failed && file.existsSync()) { // 文件实际已存在,可忽略错误或手动更新状态 print("文件下载成功,状态误报失败"); } } });
5. 版本兼容性排查
flutter_downloader 1.11.6与permission_handler 11.x的适配需要注意:
- Android 13+中避免请求已废弃的
WRITE_EXTERNAL_STORAGE权限,改用READ_MEDIA_*系列权限(仅当下载到公共目录时) - 若上述方案无效,可尝试将flutter_downloader升级到最新稳定版,或回退permission_handler到10.x版本测试兼容性
内容的提问来源于stack exchange,提问作者Nishan Kenland
相关产品推荐
相关产品推荐

