在 Flutter app 中,通过视频 URL 下载视频到手机相册

在 Flutter app 中,通过视频 URL 下载视频到手机相册可以通过以下步骤实现:

1. 添加依赖

使用 dio 下载文件,结合 path_provider 获取临时存储路径,以及 gallery_saver 将文件保存到相册。

pubspec.yaml 中添加以下依赖:

yaml 复制代码
dependencies:
  dio: ^5.0.0
  path_provider: ^2.0.15
  gallery_saver: ^2.3.0

然后运行 flutter pub get 安装依赖。


2. 下载并保存视频

实现一个函数,完成以下步骤:

  1. 获取临时文件夹路径
  2. 下载视频到本地
  3. 将下载的视频保存到相册

以下是示例代码:

dart 复制代码
import 'dart:io';

import 'package:dio/dio.dart';
import 'package:path_provider/path_provider.dart';
import 'package:gallery_saver/gallery_saver.dart';

Future<void> downloadVideoToGallery(String videoUrl) async {
  try {
    // 获取临时目录路径
    final tempDir = await getTemporaryDirectory();
    final tempPath = '${tempDir.path}/temp_video.mp4';

    // 使用 Dio 下载文件
    Dio dio = Dio();
    await dio.download(videoUrl, tempPath);

    // 将视频保存到相册
    bool? result = await GallerySaver.saveVideo(tempPath);
    if (result == true) {
      print("视频已保存到相册");
    } else {
      print("保存视频失败");
    }

    // 删除临时文件
    final tempFile = File(tempPath);
    if (await tempFile.exists()) {
      await tempFile.delete();
    }
  } catch (e) {
    print("下载或保存视频时出错: $e");
  }
}

3. 调用方法

在需要下载视频的地方调用 downloadVideoToGallery 方法,传入视频 URL:

dart 复制代码
ElevatedButton(
  onPressed: () {
    final videoUrl = "https://example.com/path-to-video.mp4";
    downloadVideoToGallery(videoUrl);
  },
  child: Text("下载视频"),
)

4. 权限配置

Android

AndroidManifest.xml 中添加存储权限:

xml 复制代码
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

在 Android 11(API 30)及以上版本,推荐使用 MediaStore 接口,GallerySaver 已兼容。

iOS

ios/Runner/Info.plist 中添加以下权限描述:

xml 复制代码
<key>NSPhotoLibraryUsageDescription</key>
<string>需要访问您的相册以保存视频。</string>

5. 注意事项

  • 确保 URL 有效:视频 URL 必须指向可下载的视频文件。
  • 错误处理:对网络错误、权限错误等情况进行处理。
  • 权限检查 :在 Android 运行时需动态申请存储权限,使用 permission_handler 包可简化操作。
相关推荐
alexhilton18 小时前
面向开发者的系统设计:像建筑师一样思考
android·kotlin·android jetpack
BG1 天前
Flutter 简仿Excel表格组件介绍
flutter
zhangmeng1 天前
FlutterBoost在iOS26真机运行崩溃问题
flutter·app·swift
恋猫de小郭1 天前
对于普通程序员来说 AI 是什么?AI 究竟用的是什么?
前端·flutter·ai编程
卡尔特斯1 天前
Flutter A GlobalKey was used multipletimes inside one widget'schild list.The ...
flutter
CYRUS_STUDIO1 天前
用 Frida 控制 Android 线程:kill 命令、挂起与恢复全解析
android·linux·逆向
CYRUS_STUDIO1 天前
Frida 实战:Android JNI 数组 (jobjectArray) 操作全流程解析
android·逆向
w_y_fan1 天前
Flutter 滚动组件总结
前端·flutter
用户091 天前
Gradle Cache Entries 深度探索
android·java·kotlin
醉过才知酒浓1 天前
Flutter Getx 的页面传参
flutter