Flutter高级媒体选择器插件advanced_media_picker的使用

发布于 1周前 作者 itying888 来自 Flutter

Flutter高级媒体选择器插件advanced_media_picker的使用

简介

advanced_media_picker 是一个用于 Flutter 的高级媒体选择器插件,支持用户从相册中选择图片和视频,并且可以拍摄照片和录制视频。该插件提供了丰富的自定义选项,使得开发者可以根据需求定制媒体选择器的样式和功能。

开始使用

配置原生平台

最低平台版本

  • Android 16
  • iOS 9.0
  • macOS 10.15

Android 配置准备

Kotlin, Gradle, AGP

我们发布的插件使用了 Kotlin 1.7.22。如果你的项目使用的是较低版本的 Kotlin/Gradle/AGP,请升级到最新版本:

  • 升级 Gradle 版本(gradle-wrapper.properties)到 7.5.1 或更高版本。
  • 升级 Kotlin 版本(ext.kotlin_version)到 1.7.22 或更高版本。
  • 升级 AGP 版本(com.android.tools.build:gradle)到 7.2.2 或更高版本。
Android 10 (Q, 29)

如果你的 compileSdkVersiontargetSdkVersion 设置为 29,需要在 AndroidManifest.xml 中添加以下配置以获取资源:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example">

  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
  <!-- Devices running Android 13 (API level 33) or higher -->
  <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
  <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
  <!-- To handle the reselection within the app on devices running Android 14
       or higher if your app targets Android 14 (API level 34) or higher.  -->
  <uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />

  <application android:label="example" android:icon="@mipmap/ic_launcher"
        android:requestLegacyExternalStorage="true"></application>
</manifest>

注意:使用 android:requestLegacyExternalStorage="true" 的应用将被 Google Play 拒绝。

iOS 配置准备

ios/Runner/Info.plist 中定义以下键值对:

<key>NSPhotoLibraryUsageDescription</key>
<string>In order to access your photo library</string>
<key>NSCameraUsageDescription</key>
<string>Your usage description here</string>
<key>NSMicrophoneUsageDescription</key>
<string>Your usage description here</string>

请求权限

此插件需要用户的权限来访问媒体库和相机。你应该处理用户拒绝权限请求的情况。

有限实体访问

iOS 上的有限实体访问

iOS 14 引入了“有限照片库”权限(PermissionState.limited)。为了抑制每次访问媒体时系统自动提示,可以在 Info.plist 中设置 PHPhotoLibraryPreventAutomaticLimitedAccessAlert 键为 YES

<key>PHPhotoLibraryPreventAutomaticLimitedAccessAlert</key>
<true/>
Android 上的有限实体访问

Android 14 (API 34) 也引入了类似 iOS 的有限资源概念。然而,行为略有不同:一旦授予对某个资源的访问权限,即使在使用 presentLimited 时未选择该资源,也无法撤销访问权限。

使用方法

添加依赖

pubspec.yaml 文件中添加插件依赖:

dependencies:
  advanced_media_picker: ^0.0.1

导入插件

在 Dart 代码中导入插件:

import 'package:advanced_media_picker/advanced_media_picker.dart';

使用插件

以下是一个简单的示例,展示了如何使用 advanced_media_picker 插件:

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

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ValueListenableBuilder<List<XFile>>(
              valueListenable: selectedFiles,
              builder: (BuildContext context, List<XFile> value, Widget? child) {
                return Column(
                  children: value.map((XFile file) {
                    return Text(file.path);
                  }).toList(),
                );
              },
            ),
            MyButton(),
          ],
        ),
      ),
    );
  }
}

final ValueNotifier<List<XFile>> selectedFiles = ValueNotifier<List<XFile>>(<XFile>[]);

class MyButton extends StatelessWidget {
  MyButton({super.key});

  final PickerController controller = PickerController();

  @override
  Widget build(BuildContext context) {
    return Center(
      child: ElevatedButton(
        child: const Text('Open Picker'),
        onPressed: () async {
          final List<XFile> result = await AdvancedMediaPicker.openPicker(
            context: context,
            controller: controller,
            isNeedVideoCamera: false,
            isNeedToShowCamera: true,
            style: PickerStyle(),
            cameraStyle: CameraStyle(),
            allowedTypes: PickerAssetType.imageAndVideo,
            maxVideoDuration: 60,
            selectionLimit: 2,
          );
          print('#result# : $result');
          selectedFiles.value = result;
        },
      ),
    );
  }
}

参数说明

  • context: BuildContext 对象。
  • style: PickerStyle 对象,用于自定义选择器的样式。
  • cameraStyle: CameraStyle 对象,用于自定义相机的样式。
  • allowedTypes: PickerAssetType 枚举,用于指定允许用户选择的媒体类型。
  • maxVideoDuration: 视频的最大时长(秒)。
  • selectionLimit: 用户可以选择的最大文件数量。如果值为 -1,则表示没有限制。
  • isNeedToShowCamera: 是否显示相机选项。
  • isNeedVideoCamera: 是否显示视频相机选项。

屏幕截图 / 演示

Screenshot Demo

观看演示视频

相关插件

插件 README
photo_manager https://pub.dev/packages/photo_manager
photo_manager_image_provider https://pub.dev/packages/photo_manager_image_provider
flutter_sticky_header https://pub.dev/packages/flutter_sticky_header
camerawesome https://pub.dev/packages/camerawesome

希望这篇文档对你有所帮助!如果有任何问题或建议,请随时联系我。


更多关于Flutter高级媒体选择器插件advanced_media_picker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter高级媒体选择器插件advanced_media_picker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 advanced_media_picker 插件的示例代码案例。这个插件允许用户在Flutter应用中选择图片和视频。以下是一个基本的实现示例:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  advanced_media_picker: ^0.10.3  # 请检查最新版本号并替换

2. 导入插件

在你的 Dart 文件中导入插件:

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

3. 配置权限

AndroidManifest.xmlInfo.plist 中添加必要的权限,以允许应用访问存储。

Android (AndroidManifest.xml)

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

iOS (Info.plist)

<key>NSPhotoLibraryAddUsageDescription</key>
<string>App needs access to the photo library</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>App needs access to the photo library</string>

4. 使用 AdvancedMediaPicker

下面是一个完整的 Flutter 应用示例,展示了如何使用 AdvancedMediaPicker 来选择图片和视频:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Advanced Media Picker Example'),
        ),
        body: MediaPickerScreen(),
      ),
    );
  }
}

class MediaPickerScreen extends StatefulWidget {
  @override
  _MediaPickerScreenState createState() => _MediaPickerScreenState();
}

class _MediaPickerScreenState extends State<MediaPickerScreen> {
  List<Media?>? selectedMedia;

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        ElevatedButton(
          onPressed: () async {
            final result = await AdvancedMediaPicker().pickMedia(
              context: context,
              maxCount: 10,
              pickType: PickType.imageAndVideo,
            );
            setState(() {
              selectedMedia = result;
            });
          },
          child: Text('Select Media'),
        ),
        SizedBox(height: 20),
        if (selectedMedia != null)
          GridView.builder(
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: 3,
              crossAxisSpacing: 4.0,
              mainAxisSpacing: 4.0,
            ),
            itemCount: selectedMedia!.length,
            itemBuilder: (context, index) {
              final media = selectedMedia![index];
              if (media == null) return Container();
              return Image.file(
                File(media.path!),
                fit: BoxFit.cover,
              );
            },
          ),
      ],
    );
  }
}

解释

  1. 依赖添加:在 pubspec.yaml 中添加 advanced_media_picker 依赖。
  2. 权限配置:在 AndroidManifest.xmlInfo.plist 中添加必要的权限。
  3. 导入插件:在 Dart 文件中导入 advanced_media_picker
  4. UI 布局
    • 使用 ElevatedButton 触发媒体选择器。
    • 使用 GridView.builder 显示选中的媒体文件。

这个示例展示了如何使用 advanced_media_picker 插件来选择和显示图片和视频。你可以根据需要进一步定制和扩展这个示例。

回到顶部