Flutter图片下载插件image_downloader_v2的使用

Flutter图片下载插件image_downloader_v2的使用

image_downloader_v2 是一个用于在Flutter中下载网络上的图片和视频,并将其保存到iOS的相册或指定目录的插件。它能够保持Exif(DateTimeOriginal)和GPS(Latitude, Longitude)信息。

获取开始

iOS

在你的 Info.plist 文件中添加以下键:

  • NSPhotoLibraryUsageDescription - 指定你的应用访问用户照片库的原因。这在可视化编辑器中被称为 Privacy - Photo Library Usage Description
  • NSPhotoLibraryAddUsageDescription - 指定你的应用获取对用户照片库的只写访问权限的原因。这在可视化编辑器中被称为 Privacy - Photo Library Additions Usage Description

Android

AndroidManifest.xml 中添加以下权限(如果你调用了 AndroidDestinationType#inExternalFilesDir() ,则不需要此设置):

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

示例

基本用法

try {
  // 保存图片的方法
  var imageId = await ImageDownloader.downloadImage("https://raw.githubusercontent.com/wiki/ko2ic/image_downloader/images/flutter.png");
  if (imageId == null) {
    return;
  }

  // 下面是获取已保存图像信息的方法
  var fileName = await ImageDownloader.findName(imageId);
  var path = await ImageDownloader.findPath(imageId);
  var size = await ImageDownloader.findByteSize(imageId);
  var mimeType = await ImageDownloader.findMimeType(imageId);
} on PlatformException catch (error) {
  print(error);
}

返回值如下:

  • 如果保存成功,则返回保存图像的 imageId
  • 如果未被授予权限,则返回 null
  • 否则,返回一个 PlatformException

自定义存储位置

你可以指定存储位置。目前,仅支持Android的外部存储。

默认提供了三个目录:

  • AndroidDestinationType.directoryDownloads -> Android上的 Environment.DIRECTORY_DOWNLOADS
  • AndroidDestinationType.directoryPictures -> Android上的 Environment.DIRECTORY_PICTURES
  • AndroidDestinationType.directoryDCIM -> Android上的 Environment.DIRECTORY_DCIM
  • AndroidDestinationType.directoryMovies -> Android上的 Environment.DIRECTORY_MOVIES

你也可以自定义存储位置。例如,以下源文件将存储在 /storage/emulated/0/sample/custom/sample.gif (取决于设备)。

await ImageDownloader.downloadImage(url,
  destination: AndroidDestinationType.custom('sample')
    ..subDirectory("custom/sample.gif"),
);

此外,通过调用 inExternalFilesDir() 方法,可以将源文件存储在 /storage/emulated/0/Android/data/<applicationId>/files/sample/custom/sample.gif (取决于设备)。

注意:调用 inExternalFilesDir() 不需要 WRITE_EXTERNAL_STORAGE 权限,但下载的图片在卸载应用时也会被删除。

进度监控

你可以获取进度值。注意:在iOS上,onProgressUpdate 无法获取 imageId

@override
void initState() {
  super.initState();

  ImageDownloader.callback(onProgressUpdate: (String? imageId, int progress) {
    setState(() {
      _progress = progress;
    });
  });
}

多文件下载

你可以通过使用 await 简单地实现多文件下载。

var list = [
  "https://raw.githubusercontent.com/wiki/ko2ic/image_downloader/images/bigsize.jpg",
  "https://raw.githubusercontent.com/wiki/ko2ic/image_downloader/images/flutter.jpg",
  "https://raw.githubusercontent.com/wiki/ko2ic/image_downloader/images/flutter_transparent.png",
  "https://raw.githubusercontent.com/wiki/ko2ic/flutter_google_ad_manager/images/sample.gif",
  "https://raw.githubusercontent.com/wiki/ko2ic/image_downloader/images/flutter_no.png",
  "https://raw.githubusercontent.com/wiki/ko2ic/image_downloader/images/flutter.png",
];

List<File> files = [];

for (var url in list) {
  try {
    var imageId = await ImageDownloader.downloadImage(url);
    var path = await ImageDownloader.findPath(imageId);
    files.add(File(path));
  } catch (error) {
    print(error);
  }
}
setState(() {
  _mulitpleFiles.addAll(files);
});

预览

有一个 open 方法可以立即预览下载的文件。如果调用它,在iOS上会显示一个使用 UIDocumentInteractionController 的预览屏幕;在Android上会通过Intent显示。

var imageId = await ImageDownloader.downloadImage(url);
var path = await ImageDownloader.findPath(imageId);
await ImageDownloader.open(path);

注意:在Android上,要使用此功能,需要进行以下设置。

AndroidManifest.xml<application> 标签内添加以下内容:

<provider
  android:name="com.ko2ic.imagedownloader.FileProvider"
  android:authorities="${applicationId}.image_downloader.provider"
  android:exported="false"
  android:grantUriPermissions="true">
  <meta-data
    android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/provider_paths"/>
</provider>

android/app/src/main/res/xml/ 目录下添加 provider_paths.xml 文件。

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
  <external-path name="external_files" path="."/>
</paths>

错误处理

downloadImage()

你可以通过 PlatformException#code 确定错误类型。如果是HTTP状态错误,代码会被存储。如果是不支持的文件格式,codeunsupported_file。重要的一点是,即使不支持的文件也被存储在临时目录中。可以通过 error.details["unsupported_file_path"]; 获取路径。

ImageDownloader.downloadImage(url).catchError((error) {
  if (error is PlatformException) {
    var path = "";
    if (error.code == "404") {
      print("Not Found Error.");
    } else if (error.code == "unsupported_file") {
      print("UnSupported FIle Error.");
      path = error.details["unsupported_file_path"];
    }
  }
})

open()

如果文件不能预览,code 会被存储为 preview_error

await ImageDownloader.open(_path).catchError((error) {
  if (error is PlatformException) {
    if (error.code == "preview_error") {
      print(error.message);
    }
  }
});

更多关于Flutter图片下载插件image_downloader_v2的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter图片下载插件image_downloader_v2的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


image_downloader_v2 是一个用于在 Flutter 应用中下载图片的插件。它提供了简单易用的 API,允许用户将图片保存到设备的相册或指定的文件夹中。以下是如何使用 image_downloader_v2 插件的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 image_downloader_v2 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  image_downloader_v2: ^1.0.0  # 请使用最新的版本号

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

2. 导入插件

在需要使用图片下载功能的 Dart 文件中导入插件:

import 'package:image_downloader_v2/image_downloader_v2.dart';

3. 下载图片

使用 ImageDownloader.downloadImage 方法来下载图片。以下是一个简单的示例:

void downloadImage(String imageUrl) async {
  try {
    // 下载图片并保存到相册
    var imageId = await ImageDownloader.downloadImage(imageUrl);
    if (imageId == null) {
      print("下载失败");
      return;
    }

    // 获取图片保存的路径
    var path = await ImageDownloader.findPath(imageId);
    print("图片已保存到: $path");
  } catch (e) {
    print("下载失败: $e");
  }
}

4. 处理权限

在 Android 和 iOS 上,下载图片到相册可能需要特定的权限。确保在 AndroidManifest.xmlInfo.plist 中添加必要的权限。

Android

AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

iOS

Info.plist 中添加以下键值对:

<key>NSPhotoLibraryAddUsageDescription</key>
<string>我们需要访问您的相册以保存图片</string>

5. 请求权限

在运行时,你可能需要请求用户授权。可以使用 permission_handler 插件来请求权限:

import 'package:permission_handler/permission_handler.dart';

void requestPermissions() async {
  var status = await Permission.storage.status;
  if (!status.isGranted) {
    await Permission.storage.request();
  }
}

6. 完整示例

以下是一个完整的示例,展示了如何下载图片并处理权限:

import 'package:flutter/material.dart';
import 'package:image_downloader_v2/image_downloader_v2.dart';
import 'package:permission_handler/permission_handler.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Image Downloader Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              await requestPermissions();
              downloadImage('https://example.com/image.jpg');
            },
            child: Text('Download Image'),
          ),
        ),
      ),
    );
  }
}

void downloadImage(String imageUrl) async {
  try {
    var imageId = await ImageDownloader.downloadImage(imageUrl);
    if (imageId == null) {
      print("下载失败");
      return;
    }

    var path = await ImageDownloader.findPath(imageId);
    print("图片已保存到: $path");
  } catch (e) {
    print("下载失败: $e");
  }
}

void requestPermissions() async {
  var status = await Permission.storage.status;
  if (!status.isGranted) {
    await Permission.storage.request();
  }
}
回到顶部