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

Flutter如何通过文件路径获取文件元数据及Flutter2升级后file_picker异常解决

Flutter 2+ 选择图库媒体并获取拍摄日期元数据方案

Flutter 2 引入空安全机制后,file_picker 4.0+ 版本对返回结果做了精简调整,默认不再自动解析媒体的EXIF等元数据,需要单独引入元数据解析工具配合实现需求,具体实现步骤如下:

  • 第一步:添加适配空安全的依赖
    在pubspec.yaml中添加如下依赖:
dependencies:
  flutter:
    sdk: flutter
  file_picker: ^5.3.0 # 适配Flutter 2及以上版本的稳定版
  exif: ^3.1.4 # 用于解析图片EXIF元数据
  flutter_media_metadata: ^1.0.2 # 可选,用于解析视频、音频类媒体元数据

执行flutter pub get完成依赖安装。

  • 第二步:实现图库媒体选择逻辑
    调用file_picker的选图/选视频逻辑代码如下:
import 'dart:io';
import 'package:file_picker/file_picker.dart';

Future<PlatformFile?> pickMedia() async {
  FilePickerResult? result = await FilePicker.platform.pickFiles(
    type: FileType.media, // 同时支持图片和视频,可按需改为FileType.image或FileType.video
    allowMultiple: false,
  );
  if (result != null && result.files.isNotEmpty) {
    return result.files.first;
  }
  return null;
}

选择后直接拿返回的PlatformFile的path属性即可渲染展示图片/视频。

  • 第三步:解析图片拍摄日期
    对于图片类媒体,使用exif包读取拍摄时间的代码如下:
import 'package:exif/exif.dart';

Future<DateTime?> getImageCaptureTime(String imagePath) async {
  final exifData = await readExifFromFile(File(imagePath));
  // 优先取原始拍摄时间,不存在则取文件记录时间
  if (exifData.containsKey('EXIF DateTimeOriginal')) {
    String dateStr = exifData['EXIF DateTimeOriginal'].toString();
    // EXIF时间格式为 "yyyy:MM:dd HH:mm:ss",转换为DateTime可识别格式
    dateStr = dateStr.replaceAll(':', '-', 2);
    return DateTime.parse(dateStr);
  } else if (exifData.containsKey('EXIF DateTime')) {
    String dateStr = exifData['EXIF DateTime'].toString();
    dateStr = dateStr.replaceAll(':', '-', 2);
    return DateTime.parse(dateStr);
  }
  return null;
}
  • 第四步:解析视频拍摄日期
    对于视频类媒体,使用flutter_media_metadata包读取的代码如下:
import 'package:flutter_media_metadata/flutter_media_metadata.dart';

Future<DateTime?> getVideoCaptureTime(String videoPath) async {
  final metadata = await MetadataRetriever.fromFile(File(videoPath));
  return metadata.date;
}

权限配置要求:

  1. iOS端需要在Info.plist中添加NSPhotoLibraryUsageDescription权限声明,说明访问相册的用途
  2. 安卓端需要在AndroidManifest.xml中添加权限:安卓12及以下添加READ_EXTERNAL_STORAGE,安卓13及以上添加READ_MEDIA_IMAGES、READ_MEDIA_VIDEO

内容的提问来源于stack exchange,提问作者Pavan Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:24:01