Flutter 鸿蒙实战:用 image_picker 三方库在 OpenHarmony 中调用系统照片选择器
Flutter 鸿蒙实战:用 image_picker 三方库在 OpenHarmony 中调用系统照片选择器
Flutter 社区地址: https://atomgit.com/CPF-Flutter/flutter_flutter
github三方库地址:https://github.com/flutter/packages/tree/main/packages/image_picker
pub地址:https://pub.dev/packages/image_picker
鸿蒙适配版:https://atomgit.com/openharmony-tpc/flutter_packages
库版本:image_picker v1.2.1(openharmony-tpc br_image_picker-v1.2.1_ohos 分支)|验证环境:Flutter 鸿蒙 SDK 3.44.9|DevEco Studio 26.0.0.821|DevEco 模拟器|HarmonyOS 7.0.0.106(API 26)
在 Flutter 应用里,"让用户选择本地图片/视频"是几乎所有内容型应用的基础能力——头像上传、发布图片、附件插入都依赖它。image_picker 是 Flutter 官方维护的选择库(pub.dev 月下载百万级),openharmony-tpc 已在 flutter_packages 的 br_image_picker-v1.2.1_ohos 分支完成鸿蒙适配。本文介绍它在 OpenHarmony 上的引入方式、federated 五包锁法、API 调用(pickImage/pickMultiImage/pickVideo + maxWidth/imageQuality 参数)、XFile 真实取值,以及在 DevEco 模拟器上观察到的完整系统 PhotoViewPicker 拉起证据。



文章目录
一、环境搭建
直接引用:https://atomgit.com/CPF-Flutter/flutter_samples/blob/master/docs/ohos/getting-started/flutter-oh-env-setup.md
flutter doctor -v 两项 [√] 即可。本文版本:Flutter OH oh-3.44.9-dev、DevEco 26.0.0.821、API 26。
二、应用背景
2.1 场景
用户头像上传、发布图片/视频、附件插入、相册备份都依赖系统 PhotoViewPicker。
2.2 为什么需要
image_picker 调用系统选择器,体验与原生一致、安全(受限访问)、自动适配 Android/iOS/Web/桌面。
2.3 解决什么问题
一句话:让 Flutter 应用在鸿蒙上以与 Android/iOS 完全一致的 API 调用系统 PhotoViewPicker 选图/选视频,并通过 XFile 拿到沙箱路径。
三、功能介绍
| 功能 | API | 说明 |
|---|---|---|
| 选单图 | pickImage(source, maxWidth, imageQuality) | 返回 XFile 沙箱路径 |
| 选多图 | pickMultiImage(imageQuality) | 返回 List |
| 选视频 | pickVideo(source) | 返回 XFile(mimeType/path) |
| 来源 | ImageSource.gallery / ImageSource.camera | 系统相册 / 系统相机 |
| XFile | name/path/mimeType/length | 真实沙箱文件 |

四、使用方法
4.1 引入(federated 五包锁同分支)
dependencies:
image_picker:
git: {url: https://atomgit.com/openharmony-tpc/flutter_packages.git,
ref: br_image_picker-v1.2.1_ohos,
path: packages/image_picker/image_picker}
dependency_overrides:
image_picker_ohos:
git: {url: https://atomgit.com/openharmony-tpc/flutter_packages.git,
ref: br_image_picker-v1.2.1_ohos,
path: packages/image_picker/image_picker_ohos}
image_picker_platform_interface:
git: {url: https://atomgit.com/openharmony-tpc/flutter_packages.git,
ref: br_image_picker-v1.2.1_ohos,
path: packages/image_picker/image_picker_platform_interface}
image_picker_android:
git: {url: https://atomgit.com/openharmony-tpc/flutter_packages.git,
ref: br_image_picker-v1.2.1_ohos,
path: packages/image_picker/image_picker_android}
image_picker_ios:
git: {url: https://atomgit.com/openharmony-tpc/flutter_packages.git,
ref: br_image_picker-v1.2.1_ohos,
path: packages/image_picker/image_picker_ios}
不锁五包时 pub 解析到 pub.dev 新版会因 VideoTrack/Picker 类签名不匹配编译失败(同 video_player/webview 五包模式)。
4.2 调用接口
final picker = ImagePicker();
// 选单图(带 maxWidth 与 imageQuality)
final XFile? single = await picker.pickImage(
source: ImageSource.gallery,
maxWidth: 1080,
imageQuality: 85,
);
// 选多图
final List<XFile> multi = await picker.pickMultiImage(imageQuality: 80);
// 选视频
final XFile? video = await picker.pickVideo(source: ImageSource.gallery);
// 拿到 XFile 后用 Image.file(File(xfile.path)) 显示
Image.file(File(single!.path), height: 200, fit: BoxFit.contain);
4.3 运行效果(鸿蒙模拟器实测)

紫色 AppBar + 三按钮(pickImage/pickMultiImage/pickVideo)+ 事件流卡

首次点 pickImage 触发 PhotoViewPicker 系统受限访问确认弹窗(“应用仅可访问您选定的图片和视频…”)——OH Photo Picker 的安全模型

完整 PhotoViewPicker 弹起(紫色顶栏 + “所有图片/所有相册” tab + 顶部"安全访问图库"说明卡 + "拍照"快捷入口 + 底部"仅可访问所选图片"提示 + 网格空白——DevEco 模拟器图库无预置图片,真机有真实内容)
五、FAQ
Q1:编译报 type not found / 五包类型不匹配?未锁 dependency_overrides 五包同 commit,pub 解析到 pub.dev 新版导致类签名不兼容。
Q2:picker 弹不出?DevEco 模拟器默认 Photo Picker 入口正常;确认应用 entry module.json5 已声明 photoAccess 能力(系统默认开启)和必要的 INTERNET 权限。
Q3:首次弹出 picker 时显示"受限访问"提示?OH PhotoViewPicker 的安全模型——应用仅能拿到用户选定的图片,无法访问全图库。要"全图库"权限需 oh.permission.READ_MEDIA 正常级(用户授权)。
Q4:pickImage 返回 null?用户取消(点击选择器右上角 × 或顶部返回箭头)。这是正常 UX,不是错误。
Q5:模拟器图库空白?DevEco 模拟器默认不预置照片。通过相册/相机手动导入或推到真机(Pura X View 模拟器可在 Settings 注入图片)。这是模拟器限制,与适配无关。
Q6:发现问题反馈?openharmony-tpc/flutter_packages 仓库提 Issue(复现 / 期望 / 实际 / 设备系统 + flutter doctor + hilog),PR 配真机截图。
六、总结与参考
image_picker v1.2.1 鸿蒙适配版开箱即用:federated 五包锁同 commit 后 pickImage/pickMultiImage/pickVideo 三种 API 在 DevEco 模拟器真实调用 PhotoViewPicker 系统选择器(带受限访问安全说明 + 拍照快捷入口 + 多 tab),XFile 返回沙箱路径,Image.file 真实显示。模拟器图库无预置图片,真机(Pura X View 等)有真实选择流程。
本文《Flutter 鸿蒙实战:用 image_picker 三方库在 OpenHarmony 中调用系统照片选择器》是三方库使用篇,核心结论是 image_picker v1.2.1 鸿蒙适配版开箱即用,无需自行编写适配代码。
文章指出,用户头像上传、发布图片视频、附件插入、相册备份等场景都依赖系统 PhotoViewPicker,而 image_picker 的价值在于以与 Android/iOS 完全一致的 API 调起系统选择器,既保证体验统一,又继承鸿蒙受限访问的安全模型,并通过 XFile 返回沙箱路径供后续处理。
功能层面覆盖三个主接口:pickImage 选单图(支持 maxWidth 与 imageQuality 压缩参数)、pickMultiImage 选多图、pickVideo 选视频,来源可指定 ImageSource.gallery 或 ImageSource.camera,返回值 XFile 提供 name、path、mimeType、length 等真实文件信息。
工程接入的关键点是 federated 五包锁定:image_picker 主包加 image_picker_ohos、platform_interface、android、ios 四个包,必须统一指向 atomgit 上 openharmony-tpc/flutter_packages 的 br_image_picker-v1.2.1_ohos 同一分支。若不锁五包,pub 会解析到 pub.dev 新版本,因 VideoTrack、Picker 等类签名不匹配直接编译失败,这与 video_player、webview 等插件的五包模式是同一类坑。
实测部分在 DevEco 模拟器完成:首屏为紫色 AppBar 加三个按钮与事件流卡;首次点击 pickImage 会触发 PhotoViewPicker 的受限访问确认弹窗,明确告知应用仅可访问用户选定的图片和视频;随后完整选择器弹起,呈现紫色顶栏、所有图片与所有相册双 tab、顶部安全访问说明卡、拍照快捷入口及底部提示。模拟器图库无预置图片导致网格空白,属环境限制而非适配问题,真机可走完整选择流程。
FAQ 进一步澄清了五包类型不匹配、picker 不弹出、受限访问提示、返回 null 属用户取消等常见疑问。配套可运行工程位于本地 picker_demo 目录。
更多推荐



所有评论(0)