Flutter图片选择插件images_picker_v2的使用

Flutter图片选择插件images_picker_v2的使用

简介

images_picker 是一个用于从Android和iOS设备的图片库中选择图片/视频,并使用相机拍摄图片/视频的Flutter插件。它还支持将图片/视频保存到相册或图库。

支持的功能

  • 从照片库中选择多张图片/视频(微信样式)
  • 使用相机拍摄图片/视频
  • 自定义裁剪比例裁剪图片
  • 压缩图片(通过质量/最大大小控制)
  • 将图片/视频保存到相册/图库
  • 当前支持的语言:
    • 系统语言
    • 中文
    • 繁体中文
    • 英语
    • 日语
    • 法语
    • 韩语
    • 德语
    • 越南语

安装

iOS

Info.plist 文件中添加以下权限描述:

<key>NSCameraUsageDescription</key>
<string>Example usage description</string>
<key>NSMicrophoneUsageDescription</key>
<string>Example usage description</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Example usage description</string>

Android

AndroidManifest.xml 文件中添加以下权限:

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

android/app/build.gradle 文件中设置最小SDK版本为21:

minSdkVersion 21

pubspec.yaml 文件中添加依赖:

dependencies:
  images_picker: ^newest

导入插件:

import 'package:images_picker/images_picker.dart';

使用方法

选择图片

Future<void> getImage() async {
  List<Media> res = await ImagesPicker.pick(
    count: 3, // 可以选择的最大数量
    pickType: PickType.image, // 选择类型(图片/视频/所有)
  );

  // 打印结果
  print(res);

  // 获取每张图片的路径
  if (res.isNotEmpty) {
    print(res.map((e) => e.path).toList());
  }
}

选择视频

Future<void> getVideo() async {
  List<Media> res = await ImagesPicker.pick(
    count: 3,
    pickType: PickType.video,
  );

  // 打印结果
  print(res);

  // 获取每段视频的路径
  if (res.isNotEmpty) {
    print(res.map((e) => e.path).toList());
  }
}

打开相机

Future<void> openCamera() async {
  List<Media> res = await ImagesPicker.openCamera(
    pickType: PickType.image,
    maxTime: 15, // 录制视频的最大时间
  );

  // 打印结果
  print(res);

  // 获取拍摄的照片路径
  if (res.isNotEmpty) {
    print(res[0].path);
  }
}

添加GIF支持

Future<void> getGif() async {
  List<Media> res = await ImagesPicker.pick(
    count: 3,
    pickType: PickType.image,
    gif: true, // 默认为true
  );

  // 打印结果
  print(res);

  // 获取每张图片的路径
  if (res.isNotEmpty) {
    print(res.map((e) => e.path).toList());
  }
}

添加最大视频时长限制

Future<void> getVideoWithMaxDuration() async {
  List<Media> res = await ImagesPicker.pick(
    count: 3,
    pickType: PickType.video,
    maxTime: 30, // 最大录制时间为30秒
  );

  // 打印结果
  print(res);

  // 获取每段视频的路径
  if (res.isNotEmpty) {
    print(res.map((e) => e.path).toList());
  }
}

添加裁剪功能(不支持GIF裁剪)

Future<void> getCroppedImage() async {
  List<Media> res = await ImagesPicker.pick(
    count: 3,
    pickType: PickType.image,
    cropOpt: CropOption(
      cropType: CropType.rect, // 当前仅支持矩形裁剪
    ),
  );

  // 打印结果
  print(res);

  // 获取每张图片的路径
  if (res.isNotEmpty) {
    print(res.map((e) => e.path).toList());
  }
}

添加压缩功能

Future<void> getCompressedImage() async {
  List<Media> res = await ImagesPicker.pick(
    count: 3,
    pickType: PickType.image,
    quality: 0.8, // 仅对Android有效
    maxSize: 500, // 仅对iOS有效(单位:KB)
  );

  // 打印结果
  print(res);

  // 获取每张图片的路径
  if (res.isNotEmpty) {
    print(res.map((e) => e.path).toList());
  }
}

设置语言

Future<void> getLocalizedPicker() async {
  List<Media> res = await ImagesPicker.pick(
    count: 3,
    pickType: PickType.image,
    language: Language.Chinese, // 设置语言
  );

  // 打印结果
  print(res);

  // 获取每张图片的路径
  if (res.isNotEmpty) {
    print(res.map((e) => e.path).toList());
  }
}

保存文件到相册

Future<void> saveImageToAlbum() async {
  File file = await downloadFile('https://cdn.chavesgu.com/logo.png');
  bool res = await ImagesPicker.saveImageToAlbum(file, albumName: "");

  // 打印结果
  print(res);
}

Future<File> downloadFile(String url) async {
  Dio simple = Dio();
  String savePath = Directory.systemTemp.path + '/' + url.split('/').last;
  await simple.download(url, savePath,
      options: Options(responseType: ResponseType.bytes));
  print(savePath);
  File file = new File(savePath);
  return file;
}

保存网络视频到相册

Future<void> saveVideoToAlbum() async {
  File file = await downloadFile('https://cdn.chavesgu.com/SampleVideo.mp4');
  bool res = await ImagesPicker.saveVideoToAlbum(file, albumName: "chaves");

  // 打印结果
  print(res);
}

Future<File> downloadFile(String url) async {
  Dio simple = Dio();
  String savePath = Directory.systemTemp.path + '/' + url.split('/').last;
  await simple.download(url, savePath,
      options: Options(responseType: ResponseType.bytes));
  print(savePath);
  File file = new File(savePath);
  return file;
}

所有参数

// 用于选择图片/视频
int count = 1, // 选择的最大数量
PickType pickType = PickType.image, // 选择类型(图片/视频/所有)
bool gif = true, // 是否支持GIF
int maxTime = 120, // 最大录制时间(秒)
CropOption cropOpt, // 裁剪选项
int maxSize, // 最大文件大小(KB)
double quality, // 压缩质量

// 用于打开相机
PickType pickType = PickType.image, // 选择类型(图片/视频/所有)
int maxTime = 15, // 最大录制时间(秒)
CropOption cropOpt, // 裁剪选项
int maxSize, // 最大文件大小(KB)
double quality, // 压缩质量

proguard规则

-keep class com.luck.picture.lib.** { *; }

-dontwarn com.yalantis.ucrop**
-keep class com.yalantis.ucrop** { *; }
-keep interface com.yalantis.ucrop** { *; }

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

1 回复

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


images_picker_v2 是一个用于在 Flutter 应用中从设备相册或相机中选择图片的插件。它提供了简单易用的 API,允许开发者轻松地实现图片选择功能。以下是使用 images_picker_v2 的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 images_picker_v2 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  images_picker_v2: ^1.0.0 # 请使用最新版本

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

2. 配置权限

在 Android 和 iOS 上,访问相册和相机需要相应的权限。

Android

android/app/src/main/AndroidManifest.xml 文件中添加以下权限:

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

iOS

ios/Runner/Info.plist 文件中添加以下键值对:

<key>NSPhotoLibraryUsageDescription</key>
<string>我们需要访问您的相册以选择图片</string>
<key>NSCameraUsageDescription</key>
<string>我们需要访问您的相机以拍摄图片</string>
<key>NSMicrophoneUsageDescription</key>
<string>我们需要访问您的麦克风以录制视频</string>

3. 使用 images_picker_v2

以下是一个简单的示例,展示如何使用 images_picker_v2 从相册中选择图片:

import 'package:flutter/material.dart';
import 'package:images_picker_v2/images_picker_v2.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ImagePickerExample(),
    );
  }
}

class ImagePickerExample extends StatefulWidget {
  [@override](/user/override)
  _ImagePickerExampleState createState() => _ImagePickerExampleState();
}

class _ImagePickerExampleState extends State<ImagePickerExample> {
  String? _imagePath;

  Future<void> _pickImage() async {
    try {
      final List<MediaFile>? result = await ImagesPickerV2.pick(
        maxCount: 1, // 最多选择1张图片
        pickType: PickType.image, // 选择图片
      );

      if (result != null && result.isNotEmpty) {
        setState(() {
          _imagePath = result.first.path;
        });
      }
    } catch (e) {
      print("Error picking image: $e");
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Picker Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            _imagePath != null
                ? Image.file(File(_imagePath!))
                : Text('No image selected.'),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _pickImage,
              child: Text('Pick Image'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部