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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:43:21