You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter如何打开同时包含图片和视频的相册

实现同时访问包含图片和视频的相册的方案

方案一:使用 image_picker 最新版本(推荐)

你之前觉得image_picker无法满足需求,大概率是使用了旧版本。当前该包的最新版本已经支持同时选择图片和视频,且可指定媒体类型:

  • 先在pubspec.yaml中添加依赖:
dependencies:
  image_picker: ^1.0.4 # 请使用官方发布的最新版本
  • 调用示例代码:
final ImagePicker picker = ImagePicker();
// 打开系统相册,允许选择图片或视频
final XFile? media = await picker.pickMedia(
  mediaType: MediaType.any, // 允许选择任意媒体类型(图片+视频)
);
if (media != null) {
  // 根据MIME类型区分图片和视频
  if (media.mimeType?.startsWith('image/') ?? false) {
    // 执行图片处理逻辑
  } else if (media.mimeType?.startsWith('video/') ?? false) {
    // 执行视频处理逻辑
  }
}

如果需要多选媒体文件,可使用pickMultiMedia方法:

final List<XFile> medias = await picker.pickMultiMedia(
  mediaType: MediaType.any,
);
// 遍历处理选中的媒体文件列表

方案二:结合 camera 包与相册访问包(自定义相册界面)

若需要将相册界面与你现有的camera拍摄界面深度整合,可使用photo_manager这类专门的相册访问包:

  1. 添加依赖到pubspec.yaml:
dependencies:
  camera: ^0.10.5+5 # 保留你现有的camera依赖
  photo_manager: ^2.7.2 # 使用最新版本
  1. 配置权限:
    • Android:在AndroidManifest.xml中添加权限声明
      <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
      <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
      <!-- 兼容Android 13以下版本 -->
      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
      
    • iOS:在Info.plist中添加权限描述
      <key>NSPhotoLibraryUsageDescription</key>
      <string>需要访问相册以选择图片和视频</string>
      
  2. 核心代码示例(获取相册中的图片和视频):
import 'package:photo_manager/photo_manager.dart';

// 先请求权限
final PermissionState permissionState = await PhotoManager.requestPermissionExtend();
if (permissionState.isAuth) {
  // 获取所有包含图片和视频的相册路径
  final List<AssetPathEntity> albumPaths = await PhotoManager.getAssetPathList(
    type: RequestType.all, // 指定获取图片+视频类型资源
    filterOption: FilterOptionGroup(
      imageOption: const FilterOption(needTitle: true),
      videoOption: const FilterOption(needTitle: true),
    ),
  );
  // 遍历相册获取媒体资源
  if (albumPaths.isNotEmpty) {
    final List<AssetEntity> mediaAssets = await albumPaths[0].getAssetListPaged(page: 0, size: 50);
    for (var asset in mediaAssets) {
      if (asset.type == AssetType.image) {
        final File? imageFile = await asset.file;
        // 处理图片文件
      } else if (asset.type == AssetType.video) {
        final File? videoFile = await asset.file;
        // 处理视频文件
      }
    }
  }
}

这种方式能实现完全自定义的相册UI,和现有拍摄界面无缝融合,但需要自行开发相册的展示、选择逻辑。

补充说明

  • image_picker是系统原生相册的封装,优点是无需自定义UI、兼容性强;缺点是UI样式受系统限制。
  • photo_manager适合需要高度定制化相册界面的场景,但需要更多代码开发成本。

内容的提问来源于stack exchange,提问作者Amer Al Haj Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:00:56