在 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 包可简化操作。
相关推荐
plainGeekDev10 小时前
工厂模式 → Hilt
android·java·kotlin
雨白10 小时前
深入理解 Kotlin 协程 (十):引而不发,探秘 Flow 冷流机制与异常透明性
android·kotlin
plainGeekDev10 小时前
Application 单例 → Hilt Singleton
android·java·kotlin
程序员码歌12 小时前
我全程用 AI开发了一款微信小游戏,上线了
android·前端·游戏开发
1001101_QIA12 小时前
flutter打包流程
flutter
黄林晴12 小时前
你敢信吗?同样是跨端,KMP 跟 RN 居然差这么多!
android·前端
zhao1zhihui13 小时前
iOS Bug 定位实战:从断点、LLDB 到 Xcode 与 Instruments
ios·xcode
zbmwa14 小时前
jetpack compose 副作用 produceState
android
hunterandroid15 小时前
Android 后台任务可靠性排查:从 WorkManager 观测到失败重试闭环
android·前端
zhao1zhihui15 小时前
Objective-C Runtime:从消息派发到安全 Hook
ios