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

使用Flutter的http或dio包下载MP4视频时应用崩溃

解决Flutter使用http/dio下载MP4时崩溃(提示Lost connection to device)

内存溢出(最常见原因)

直接将整个MP4文件加载到内存会触发内存溢出,导致应用进程被系统强制杀死,此时控制台仅显示设备连接丢失。解决核心是流式下载,边下载边写入本地文件,避免占用过多内存:

  • Dio实现示例:
    await Dio().download(
      "https://example.com/target.mp4",
      "/storage/emulated/0/Download/saved_video.mp4",
      onReceiveProgress: (received, total) {
        // 可选:处理下载进度
      },
    );
    
  • Http实现示例:
    final response = await http.get(
      Uri.parse("https://example.com/target.mp4"),
      stream: true, // 开启流式响应
    );
    final saveFile = File("/storage/emulated/0/Download/saved_video.mp4");
    final fileSink = saveFile.openWrite();
    await response.stream.pipe(fileSink);
    await fileSink.close();
    

存储权限缺失

Android 13+或iOS未申请对应存储权限时,写入文件操作可能触发底层崩溃,导致设备连接丢失。需适配系统权限:

  • Android:在AndroidManifest.xml中添加对应权限:
    <!-- Android 10及以下 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- Android 13+ 媒体文件权限 -->
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
    
  • iOS:在Info.plist中添加权限描述:
    <key>NSPhotoLibraryAddUsageDescription</key>
    <string>需要存储视频到相册</string>
    <key>NSPhotoLibraryUsageDescription</key>
    <string>需要访问相册存储视频</string>
    
    代码中使用permission_handler包动态申请权限,确保写入文件前权限已通过。

查看原生崩溃日志定位深层问题

Flutter控制台仅显示连接丢失时,可能是Native层触发的崩溃,需查看设备原生日志:

  • Android:执行命令adb logcat *:E筛选错误日志,找到崩溃栈信息。
  • iOS:打开Xcode的「Devices and Simulators」,选中对应设备查看Crash Logs,定位具体异常原因。

超大文件分块下载优化

若MP4文件体积极大,可尝试分块下载后合并:
通过设置请求头Range分片获取文件内容,比如每次下载1MB:

// Dio分块请求示例
final response = await Dio().get(
  "https://example.com/large.mp4",
  options: Options(
    headers: {"Range": "bytes=0-1048575"}, // 下载0到1MB区间
    responseType: ResponseType.stream,
  ),
);

多次请求不同区间后,将所有分片文件合并为完整MP4。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 17:17:12