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

Android 13+版本使用flutter_downloader无法下载媒体文件求助

Android 13下flutter_downloader显示下载完成但无文件的解决办法

1. 换用应用私有存储路径

Android 13对公共存储的访问限制更严格,flutter_downloader默认的公共路径可能无法正常写入。试试改用应用私有存储,代码示例:

final taskId = await FlutterDownloader.enqueue(
  url: '你的下载链接',
  savedDir: (await getApplicationDocumentsDirectory()).path,
  showNotification: true,
  openFileFromNotification: true,
);

私有存储不需要额外权限,直接就能使用,避开公共存储的权限坑。

2. 修复权限检查的逻辑漏洞

你当前的权限检查代码存在逻辑错误:

  • Android 13+不需要WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE,且你在判断SDK≥33时仅检查了videos和photos权限,但后续错误地判断未赋值的isStoragePermission,导致逻辑混乱。
  • 正确的权限检查逻辑:
Future<bool> _checkPermission() async {
  AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
  if (androidInfo.version.sdkInt! >= 33) {
    // Android13+仅需对应媒体类型的读取权限,下载到私有存储无需写入权限
    final photosGranted = await Permission.photos.status.isGranted;
    final videosGranted = await Permission.videos.status.isGranted;
    // 若下载图片/视频则确保对应权限,其他文件无需这些权限
    return photosGranted || videosGranted;
  } else {
    // Android12及以下需要存储权限
    return await Permission.storage.status.isGranted ||
        await Permission.storage.request().isGranted;
  }
}

3. 移除不必要的权限

Android 13下不需要WRITE_EXTERNAL_STORAGE和MANAGE_EXTERNAL_STORAGE(非文件管理器类应用申请该权限会被Google Play拒绝),修改AndroidManifest.xml保留必要权限即可:

<!-- 仅保留必要权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
<!-- 为Android12及以下的存储权限添加版本限制 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>

4. 更新flutter_downloader到最新版本

旧版本的flutter_downloader可能未适配Android 13的存储变更,在pubspec.yaml中更新至最新稳定版:

dependencies:
  flutter_downloader: ^1.10.4 # 替换为当前最新稳定版本

5. 监听下载错误信息

显示“完成”但无文件,可能是写入失败但未触发错误回调。添加监听获取详细错误:

FlutterDownloader.registerCallback((id, status, progress) async {
  if (status == DownloadTaskStatus.failed) {
    final error = await FlutterDownloader.getTaskError(id);
    print('下载错误详情: $error');
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:35:32