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; }
权限配置要求:
- iOS端需要在Info.plist中添加
NSPhotoLibraryUsageDescription权限声明,说明访问相册的用途- 安卓端需要在AndroidManifest.xml中添加权限:安卓12及以下添加
READ_EXTERNAL_STORAGE,安卓13及以上添加READ_MEDIA_IMAGES、READ_MEDIA_VIDEO
内容的提问来源于stack exchange,提问作者Pavan Kumar
相关产品推荐
相关产品推荐

