当前位置: 首页 > article >正文

Flutter 三方库 ImagePicker 的鸿蒙化适配与实战指南(相机/相册/多图选择全实现)

Flutter 三方库 ImagePicker 的鸿蒙化适配与实战指南相机/相册/多图选择全实现欢迎加入开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net哈喽大家好呀我是一名上海某高校的大一计算机新生最近在捣鼓Flutter for OpenHarmony的开发项目继上次搞定了图片压缩功能之后今天终于把「图片选择」模块也啃下来了作为App开发里几乎每个项目都要用到的基础功能我这次踩的坑真的比想象中多太多了尤其是鸿蒙平台的权限适配和库兼容问题差点给我整emo了… 今天就把我从依赖选型到代码实现再到各种奇葩报错的完整过程全部分享给大家帮你少走我走过的弯路 为什么图片选择功能这么重要不知道有没有和我一样的小伙伴刚学做App的时候以为图片选择就是调用个API的事结果上手才发现这个功能的坑真的巨多不管是用户上传头像、发布动态还是修改个人资料几乎所有和图片相关的操作第一步都是从选择图片开始的。而且在鸿蒙设备上原生的相册和相机调用逻辑和Android/iOS完全不一样官方的image_picker库在鸿蒙上会遇到各种权限和兼容问题比如无法读取相册、相机调用黑屏、多图选择失效等等。所以我这次的目标就是找一个适配鸿蒙的图片选择方案实现相机拍照、相册单选、相册多图选择这三个核心功能而且要能在鸿蒙设备上稳定运行不崩不卡️ 第一步依赖选型我差点又踩了大坑一开始我还是想着偷懒直接用pub.dev上下载量最高的官方image_picker库结果又经历了一次“从满怀希望到崩溃”的过程…❌ 踩坑1官方image_picker在鸿蒙上直接“罢工”我开开心心在pubspec.yaml里加了依赖运行flutter pub get也成功了结果一在鸿蒙设备上测试点击选择图片按钮App直接没反应也不报错就是打不开相册我翻了半天官方文档和issues才发现官方的image_picker库目前还没有对OpenHarmony做完整适配原生桥接代码不兼容鸿蒙的相册和相机API直接用根本跑不起来我这种大一新生根本不会自己改原生适配代码只能含泪放弃。✅ 换个思路鸿蒙专属适配库才是YYDS后来我在OpenHarmony TPC的Flutter三方库仓库里翻了好久终于找到了救星——image_picker_ohos这个库是社区专门针对鸿蒙平台适配的图片选择器完美解决了官方库在鸿蒙上的兼容问题而且使用方式和官方库几乎一样上手成本很低它的优点真的香到哭专门适配了鸿蒙平台的相册和相机API不用自己折腾原生代码完美支持多图选择、相机拍照、图片质量设置覆盖了大部分开发场景社区维护很活跃AtomGit仓库里的issue回复也很及时新手友好度拉满权限适配逻辑已经封装好了只需要在配置文件里声明权限就能用1. 最终的依赖配置亲测有效在pubspec.yaml里添加依赖dependencies:flutter:sdk:flutterimage_picker_ohos:^1.0.4# 鸿蒙专属适配版图片选择器解决官方库兼容问题划重点根据社区规范文中提及代码托管平台时必须使用AtomGit这个库的适配代码也是在AtomGit的社区仓库里维护的完全符合投稿要求2. 安装依赖准备起飞打开终端在项目根目录执行命令flutter pub get这次终于没有报错了依赖安装成功接下来就是激动人心的代码环节啦~ 第二步分步实现相机/相册/多图选择全覆盖我把整个图片选择的流程拆成了3个部分每个部分都有完整的代码和我踩过的坑大家可以直接复制到项目里用1. 相册单选从相册里选一张图片首先是最基础的相册单选功能用户从相册里选择一张图片返回图片的字节流方便后续处理比如上传、压缩、裁剪importdart:typed_data;importpackage:image_picker_ohos/image_picker_ohos.dart;// 从相册选择单张图片返回图片字节流FutureUint8List?pickSingleImageFromGallery()async{try{finalImagePickerpickerImagePicker();// 调用鸿蒙适配的相册选择器设置图片质量为100避免选择时被压缩finalXFile?selectedImageawaitpicker.pickImage(source:ImageSource.gallery,imageQuality:100,// 100为最高质量避免选择时自动压缩影响后续处理maxWidth:1920,// 设置最大宽度避免选择超大图片导致内存溢出maxHeight:1080,// 设置最大高度适配大部分场景);if(selectedImagenull){print(用户取消了选择);returnnull;}// 把选中的图片转成字节流方便后续压缩、上传等操作finalUint8ListimageBytesawaitselectedImage.readAsBytes();print(选中图片大小${imageBytes.length/1024}KB);print(选中图片路径${selectedImage.path});returnimageBytes;}catch(e){print(从相册选择图片出错$e);rethrow;}}2. 相册多图选择一次性选多张图片用户经常会一次性选择多张图片比如发布动态的时候所以多图选择也是必须实现的功能// 从相册选择多张图片返回图片字节流列表FutureListUint8ListpickMultiImagesFromGallery()async{try{finalImagePickerpickerImagePicker();// 调用多图选择方法设置图片质量和最大尺寸finalListXFileselectedImagesawaitpicker.pickMultiImage(imageQuality:100,maxWidth:1920,maxHeight:1080,);if(selectedImages.isEmpty){print(用户没有选择任何图片);return[];}// 把选中的图片批量转成字节流ListUint8ListimageBytesList[];for(varimageinselectedImages){finalbytesawaitimage.readAsBytes();imageBytesList.add(bytes);print(选中图片大小${bytes.length/1024}KB);}returnimageBytesList;}catch(e){print(批量选择图片出错$e);rethrow;}}3. 相机拍照调用相机拍摄照片除了从相册选择很多场景还需要直接调用相机拍照比如用户上传头像时直接拍摄我也一起实现了// 调用相机拍摄照片返回图片字节流FutureUint8List?takePhotoWithCamera()async{try{finalImagePickerpickerImagePicker();// 调用相机拍摄设置图片质量和尺寸finalXFile?capturedImageawaitpicker.pickImage(source:ImageSource.camera,imageQuality:100,maxWidth:1920,maxHeight:1080,);if(capturedImagenull){print(用户取消了拍照);returnnull;}// 把拍摄的照片转成字节流finalUint8ListimageBytesawaitcapturedImage.readAsBytes();print(拍摄照片大小${imageBytes.length/1024}KB);print(拍摄照片路径${capturedImage.path});returnimageBytes;}catch(e){print(调用相机拍照出错$e);rethrow;}} 第三步开发过程中踩过的坑一个都别漏❌ 踩坑2鸿蒙相册权限没配置App直接“静默失败”我第一次运行相册选择功能的时候点击按钮App完全没反应也不报错就是打不开相册查了好久才发现鸿蒙设备上读取相册和相机必须要在module.json5里配置权限不然系统会直接拦截App连报错都不会报打开ohos/entry/src/main/module.json5在requestPermissions里加上这两段权限配置requestPermissions:[// 读取相册图片权限{name:ohos.permission.READ_MEDIA_IMAGES,reason:$string:permission_read_media_images_reason,usedScene:{abilities:[EntryAbility],when:inuse}},// 调用相机权限{name:ohos.permission.CAMERA,reason:$string:permission_camera_reason,usedScene:{abilities:[EntryAbility],when:inuse}}]加上权限之后重启应用终于能正常打开相册和相机了鸿蒙的权限管理真的太严格了新手小伙伴们一定要记得配置不然真的会被搞疯❌ 踩坑3多图选择时部分图片读取失败出现空数据我第一次测试多图选择的时候选了5张图片结果只成功读取了3张另外两张返回的是空字节流排查了好久才发现有些图片的路径格式鸿蒙系统不支持或者图片文件损坏了导致readAsBytes()方法读取失败。解决办法就是给每个图片的读取操作加上异常捕获即使单张图片读取失败也不会影响整个批量操作for(varimageinselectedImages){try{finalbytesawaitimage.readAsBytes();imageBytesList.add(bytes);print(成功读取图片${image.path});}catch(e){print(读取图片失败${image.path}错误信息$e);// 读取失败时跳过这张图片避免影响其他图片的处理continue;}}加上异常捕获之后即使有图片读取失败App也不会崩溃只会跳过这张图片用户体验好了很多❌ 踩坑4相机调用时黑屏无法预览画面我第一次测试相机拍照的时候点击拍照按钮App直接黑屏了只能强制重启后来才知道鸿蒙系统的相机权限除了要在配置文件里声明还要在代码里动态申请不然系统会拒绝相机调用导致黑屏我用了鸿蒙适配的权限申请方法在调用相机之前先申请权限importpackage:permission_handler_ohos/permission_handler_ohos.dart;// 申请相机权限FutureboolrequestCameraPermission()async{PermissionStatusstatusawaitPermission.camera.status;if(status.isGranted){returntrue;}PermissionStatusnewStatusawaitPermission.camera.request();returnnewStatus.isGranted;}// 调用相机拍照前先申请权限FutureUint8List?takePhotoWithCamera()async{// 先申请相机权限bool hasPermissionawaitrequestCameraPermission();if(!hasPermission){print(用户拒绝了相机权限申请);// 给用户提示引导用户去设置里开启权限returnnull;}try{// 原来的相机拍照代码...}catch(e){print(调用相机拍照出错$e);rethrow;}}加上动态权限申请之后相机终于能正常调用了再也不会黑屏了❌ 踩坑5选择超大图片导致App内存溢出崩溃有一次我选了一张10MB的高清原图结果App直接崩溃了后来才知道鸿蒙设备的内存是有限的一次性读取超大图片的字节流会导致内存溢出App直接闪退解决办法就是在选择图片的时候设置maxWidth和maxHeight参数限制图片的最大尺寸同时设置imageQuality避免选择时读取超大体积的原图finalXFile?selectedImageawaitpicker.pickImage(source:ImageSource.gallery,imageQuality:80,// 降低选择时的图片质量减小体积maxWidth:1920,// 限制最大宽度maxHeight:1080,// 限制最大高度);加上尺寸和质量限制之后再也没有出现过内存溢出的问题App稳定了很多 第四步鸿蒙设备上的完整测试与效果展示代码和权限配置都搞定之后我在我的鸿蒙设备上做了完整测试功能表现超棒相册单选点击按钮能正常打开相册选择单张图片读取字节流成功没有报错相册多图选择一次性选择5张图片都能正常读取不会出现空数据相机拍照调用相机时会先申请权限用户授权后能正常预览画面、拍摄照片照片读取成功异常处理拒绝权限、取消选择、图片读取失败的场景都能正常处理App不会崩溃此处附鸿蒙设备上成功运行的截图包含相册选择界面、相机拍照界面、图片选择结果展示— 大一新生的踩坑心得总结这次实现图片选择功能我前前后后折腾了快一周踩的坑比上次的图片压缩还多给大家总结几个新手必看的要点依赖选型一定要优先选鸿蒙专属适配库官方库虽然下载量高但在鸿蒙上的适配真的很拉胯像image_picker_ohos这种社区适配的库用起来省心太多了鸿蒙权限配置一定要“声明动态申请”双保险不管是相册还是相机只在配置文件里声明权限是不够的一定要在代码里动态申请不然很容易出现静默失败或者黑屏的问题一定要处理异常和边界情况比如用户取消选择、权限被拒、图片读取失败、超大图片内存溢出这些场景都要加try-catch和限制条件不然App很容易崩溃多去AtomGit的社区仓库里找适配方案OpenHarmony TPC的Flutter三方库仓库里有很多社区维护的适配好的库比自己去pub.dev瞎找靠谱多了 后续计划图片选择功能终于搞定啦和之前的图片压缩功能结合起来就能实现完整的图片上传流程了接下来我打算继续实现图片裁剪功能把「图片处理三件套」凑齐后面也会把踩坑记录写成教程分享出来和大家一起学习进步如果你也是刚入门Flutter for OpenHarmony的小伙伴欢迎在评论区一起交流踩坑经验呀也可以加入社区一起学习~

相关文章:

Flutter 三方库 ImagePicker 的鸿蒙化适配与实战指南(相机/相册/多图选择全实现)

Flutter 三方库 ImagePicker 的鸿蒙化适配与实战指南(相机/相册/多图选择全实现) 欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net 哈喽大家好呀👋!我是一名上海某高校的大一计算机新生&#x…...

OBS高级计时器:让你的直播和录制时间管理变得简单高效

OBS高级计时器:让你的直播和录制时间管理变得简单高效 【免费下载链接】obs-advanced-timer 项目地址: https://gitcode.com/gh_mirrors/ob/obs-advanced-timer 你是否在直播或视频录制时经常为时间管理而烦恼?想要一个灵活、专业的计时器来提升…...

AUTOSAR DEM实战:手把手教你理解DTC状态位与故障事件映射(含代码示例)

AUTOSAR DEM深度解析:DTC状态位与故障事件映射的工程实践 在汽车电子系统开发中,诊断功能的设计与实现一直是工程师面临的核心挑战之一。AUTOSAR标准中的诊断事件管理(DEM)模块作为连接底层故障检测与上层诊断服务的桥梁&#xff…...

【USV】无人水面艇的轨迹跟踪和碰撞避免的实时非线性模型预测控制研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。 🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &…...

UDS诊断开发避坑指南:从ISO14229标准到代码实现,如何正确处理NRC优先级?

UDS诊断开发中的NRC优先级处理:从标准解读到嵌入式实践 在汽车电子控制单元(ECU)开发领域,UDS(Unified Diagnostic Services)诊断协议是实现车辆故障检测、参数配置和软件刷写等功能的核心技术框架。作为IS…...

八大网盘直链下载助手:告别限速,极速下载完整指南

八大网盘直链下载助手:告别限速,极速下载完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘…...

ThinkBook 14+ 2023 双硬盘双系统实战:三星980 Pro 2T装Win11,原盘装Ubuntu 23.04

ThinkBook 14 2023双系统终极配置指南:从硬件规划到完美引导 最近两年,双硬盘双系统的组合在技术爱好者中越来越流行。ThinkBook 14 2023凭借其双M.2接口设计(一个PCIe 4.0和一个PCIe 3.0),成为实现这一方案的理想平台…...

B站缓存视频合并工具:零基础3步将碎片视频变完整MP4

B站缓存视频合并工具:零基础3步将碎片视频变完整MP4 【免费下载链接】BilibiliCacheVideoMerge 🔥🔥Android上将bilibili缓存视频合并导出为mp4,支持安卓5.0 ~ 13,视频挂载弹幕播放(Android consolidates and exports …...

为 OpenClaw 配置 Taotoken 作为其大模型供应商

为 OpenClaw 配置 Taotoken 作为其大模型供应商 1. 准备工作 在开始配置之前,请确保您已经完成以下准备工作。首先,您需要拥有一个有效的 Taotoken API Key,可以在 Taotoken 控制台中创建。其次,您需要确定要使用的模型 ID&…...

暗黑破坏神2存档编辑器的完整指南:5分钟学会免费修改D2/D2R游戏存档

暗黑破坏神2存档编辑器的完整指南:5分钟学会免费修改D2/D2R游戏存档 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾经因为角色build不理想而想重新开始?或者因为意外丢失了珍贵的装备而感到沮丧…...

深入/dev/xdma*:手把手教你用XDMA驱动工具链(reg_rw, dma_to/from_device)进行FPGA数据读写调试

深入解析XDMA驱动工具链:FPGA数据交互实战指南 在FPGA与主机系统的高速数据交互场景中,Xilinx的XDMA(PCI Express DMA)解决方案凭借其高性能和灵活性成为众多工程师的首选。本文将带您深入探索/dev/xdma*设备节点的奥秘&#xff0…...

ESP32量产必看:Secure Boot与Flash加密的完整配置流程(含批量烧录脚本)

ESP32量产安全配置实战:从密钥管理到自动化产线部署 当你的ESP32设备从实验室走向量产线时,安全配置就从技术问题升级为系统工程。我曾亲眼见过一个团队因为密钥管理不当,导致三千台设备无法固件升级的惨痛案例——这不是技术文档里会告诉你的…...

STM32+LAN8720网线热插拔翻车实录:我的板子为什么插上网线没反应?

STM32与LAN8720热插拔问题深度解析:从硬件链路检测到软件容错设计 引言:当网线插入变成一场"玄学"实验 调试STM32以太网功能的开发者们,是否经历过这样的场景:实验室里,你反复插拔网线,开发板却像…...

教育机构构建AI应用实验平台时采用Taotoken的接入方案

教育机构构建AI应用实验平台时采用Taotoken的接入方案 1. 教育实验平台的API管理需求 高校与培训机构在构建AI应用实验平台时,通常面临三个核心挑战:多模型接入的复杂性、学生团队权限隔离需求以及实验资源的精细化管控。传统模式下,教师需…...

跨平台数据访问的终极解决方案:如何在Windows中读取Linux RAID阵列

跨平台数据访问的终极解决方案:如何在Windows中读取Linux RAID阵列 【免费下载链接】winmd WinMD 项目地址: https://gitcode.com/gh_mirrors/wi/winmd 当你在双系统环境中工作,或者在紧急情况下需要从Windows访问Linux服务器上的重要数据时&…...

5分钟掌握Switch游戏文件管理的完整解决方案

5分钟掌握Switch游戏文件管理的完整解决方案 【免费下载链接】NSC_BUILDER Nintendo Switch Cleaner and Builder. A batchfile, python and html script based in hacbuild and Nuts python libraries. Designed initially to erase titlerights encryption from nsp files an…...

借助 API Key 管理与访问控制功能实现团队内安全的模型调用权限分配

借助 API Key 管理与访问控制功能实现团队内安全的模型调用权限分配 1. 团队协作中的 API Key 管理挑战 在多人协作的开发环境中,直接共享主账号 API Key 会带来一系列安全隐患。密钥泄露可能导致未经授权的调用和费用损失,统一密钥也难以区分不同成员…...

UNIX/Linux内存管理机制与优化实践

1. UNIX内存管理机制解析现代操作系统的内存管理机制是系统可靠性的基石。UNIX系统通过硬件内存管理单元(MMU)实现的虚拟内存技术,为每个进程提供独立的4GB虚拟地址空间(32位系统)。这种设计创造了一个关键的安全边界:进程无法直接…...

相机标定入门:DLT、对极几何和PnP到底啥关系?一张图讲清楚

相机标定三剑客:DLT、对极几何与PnP的实战关系图谱 刚接触计算机视觉时,我总被各种标定算法绕得晕头转向——为什么论文里DLT和对极几何总是一起出现?PnP算法又为什么要用DLT做初始化?直到亲手实现了一个AR标记检测系统后&#xf…...

从NASA到你的电脑:希尔伯特-黄变换(HHT)是如何‘听懂’非平稳信号的?

从NASA到你的电脑:希尔伯特-黄变换(HHT)是如何‘听懂’非平稳信号的? 想象一下,你正站在嘈杂的菜市场里,试图听清远处朋友的呼喊。背景中此起彼伏的叫卖声、车辆的喇叭声、人群的交谈声交织在一起——这就是…...

GESP四级C++真题解析:手把手教你用‘幸运数’算法搞定数位变换(附完整代码)

GESP四级C真题解析:手把手教你用‘幸运数’算法搞定数位变换(附完整代码) 第一次看到"幸运数"这个概念时,许多同学可能会被题目描述中"奇数位变换"、"各位数和"等术语吓到。但当我真正拆解这道题时…...

基于虚拟仪器的条码型水准尺检定装置边缘检测【附代码】

✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。 ✅ 如需沟通交流,扫描文章底部二维码。(1)水准尺条码图像预处理与改进Canny边缘粗定位:检定…...

Spring Boot项目里,如何用注解优雅切换ShardingSphere和普通数据源?

Spring Boot项目中基于注解的ShardingSphere与普通数据源无感切换实践 在分布式系统架构中,数据源管理往往面临一个典型矛盾:既要享受分库分表带来的性能提升,又要保留对传统单表查询的兼容性。本文将分享一种基于Spring Boot的优雅解决方案&…...

GUI Guider设计完UI后,如何一步步把代码‘喂’给STM32?保姆级移植与排错指南

GUI Guider设计完UI后,如何一步步把代码‘喂’给STM32?保姆级移植与排错指南 当你用GUI Guider完成精美的UI设计后,真正的挑战才刚刚开始。本文将带你穿越从导出代码到STM32实际运行的完整路径,解决那些官方文档没告诉你的"坑…...

从Arduino到树莓派:CH340G驱动安装与故障排查全指南(Win11/Mac/Linux)

CH340G驱动安装与故障排查全指南:跨越Win11/Mac/Linux的终极解决方案 当你兴奋地拆开新到的Arduino开发板或ESP模块,准备大展身手时,电脑却冷冰冰地提示"无法识别的USB设备"——这种挫败感我太熟悉了。作为一款广泛用于国产开发板的…...

使用 Taotoken 的模型广场在 Ubuntu 开发中快速选型与切换 AI 模型

使用 Taotoken 的模型广场在 Ubuntu 开发中快速选型与切换 AI 模型 1. 模型广场的核心功能 Taotoken 模型广场是开发者进行模型选型的一站式信息中心。通过访问控制台中的模型广场页面,开发者可以查看平台当前支持的所有模型及其关键属性。每个模型条目会展示模型…...

如何彻底清理macOS应用残留文件?专业开源工具Pearcleaner使用指南

如何彻底清理macOS应用残留文件?专业开源工具Pearcleaner使用指南 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 你是否曾经在macOS上删除应用后…...

通过模型广场对比主流模型特性并选择适合当前任务的模型进行调用

通过模型广场对比主流模型特性并选择适合当前任务的模型进行调用 1. 模型广场功能概述 Taotoken 模型广场是平台提供的核心功能之一,汇集了多个厂商的大模型服务。通过该功能,开发者可以直观查看不同模型的性能参数、适用场景和计费标准,为…...

手把手教你用U盘搞定VMware ESXi 7.0安装,附网络配置与避坑指南

手把手教你用U盘搞定VMware ESXi 7.0安装,附网络配置与避坑指南 在个人开发者和小团队的实际工作中,搭建一个稳定高效的虚拟化环境往往能极大提升开发效率。对于预算有限但又需要灵活部署的场景,使用U盘安装VMware ESXi 7.0无疑是最经济实惠的…...

Orange Pi OS:融合Windows 11界面与Android生态的桌面系统解析

1. Orange Pi OS:一款融合Windows 11界面与Android生态的桌面操作系统 深圳迅龙软件(Shenzhen Xunlong Software)近期正式发布了基于Android的Orange Pi OS操作系统,这款系统最引人注目的特点是其高度模仿Windows 11的桌面界面设计…...