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状态错误,代码会被存储。如果是不支持的文件格式,code
为 unsupported_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
更多关于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.xml
和 Info.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();
}
}