在 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 包可简化操作。
相关推荐
alexhilton5 小时前
Room Fts4:全文搜索替代 SQL LIKE
android·kotlin·android jetpack
hai_android11 小时前
把 Android App 打包成系统应用(System App)
android·kotlin·android jetpack
JMchen11 小时前
【Jetpack 内核实战 01】开篇:Jetpack 组件全家桶核心逻辑与专栏完整规划
android·kotlin·android jetpack
骑着蜗牛撵大象32713 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
hunterandroid13 小时前
Retrofit 网络请求的异常处理与重试策略实战
android
sejinan14 小时前
极致轻量与秒级起播:NativeWasmTv 开源硬核技术解析与升级版体验
android·开源·webview·tv
小羊没烦恼!14 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
茶底世界之下14 小时前
林间步道要不要加暗角?用 Awaking 把强度收在20%
前端·ios·图片资源
season_zhu14 小时前
Skills For Real Engineers 系列之一:先配好项目,再让 ask-matt 帮我选技能
ios·openai·ai编程
mmsx14 小时前
Android 静默失败实录:五个没有日志的线上事故
android·kotlin