Flutter高级媒体选择器插件advanced_media_picker的使用
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)
如果你的 compileSdkVersion
或 targetSdkVersion
设置为 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
: 是否显示视频相机选项。
屏幕截图 / 演示
相关插件
插件 | 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
更多关于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.xml
和 Info.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,
);
},
),
],
);
}
}
解释
- 依赖添加:在
pubspec.yaml
中添加advanced_media_picker
依赖。 - 权限配置:在
AndroidManifest.xml
和Info.plist
中添加必要的权限。 - 导入插件:在 Dart 文件中导入
advanced_media_picker
。 - UI 布局:
- 使用
ElevatedButton
触发媒体选择器。 - 使用
GridView.builder
显示选中的媒体文件。
- 使用
这个示例展示了如何使用 advanced_media_picker
插件来选择和显示图片和视频。你可以根据需要进一步定制和扩展这个示例。