37 相册读取与图片选择:PhotoViewPicker 实战
37 相册读取与图片选择PhotoViewPicker 实战前言图37 相册读取与图片选择PhotoViewPicker 实战 运行效果截图HarmonyOS NEXT除了直接拍照从相册选择已有图片也是常见的图片获取方式。鸿蒙提供了PhotoViewPicker——一个系统级的图片选择器让用户可以从相册中选择一张或多张图片。本文以鹿鹿·笔迹心理分析项目中 [CapturePage.ets](file:///Users/fiona/Downloads/bijixinli/harmony-app/entry/src/main/ets/pages/CapturePage.ets) 的pickFromAlbum()方法为例深入解析 PhotoViewPicker 的使用方法和相册选择流程。鸿蒙官方·PhotoViewPicker 文档developer.huawei.com项目源码仓库harmony-app GitHub图PhotoViewPicker 相册选择流程——创建选择器 → 配置选项 → 获取 URI文件系统系统相册 UIPhotoViewPickerCapturePage文件系统系统相册 UIPhotoViewPickerCapturePagenew photoAccessHelper.PhotoViewPicker()select(PhotoSelectOptions)打开系统相册界面用户浏览并选择图片返回选中图片PhotoSelectResult { photoUris }通过 URI 读取图片数据一、PhotoViewPicker 基础1.1 模块导入import{photoAccessHelper}fromkit.MediaLibraryKit1.2 基本使用privateasyncpickFromAlbum(){try{// ① 创建选择器constphotoPickernewphotoAccessHelper.PhotoViewPicker()// ② 配置选项constpickerOptions:photoAccessHelper.PhotoSelectOptions{maxSelectNumber:1// 最多选择 1 张}// ③ 打开选择器constresult:photoAccessHelper.PhotoSelectResultawaitphotoPicker.select(pickerOptions)// ④ 处理结果if(resultresult.photoUrisresult.photoUris.length0){this.previewPathresult.photoUris[0]this.hasPreviewtruethis.sourcegallery}}catch(error){hilog.error(0x0000,TAG,相册选择失败: %s,JSON.stringify(error))}}二、PhotoSelectOptions 配置2.1 选项详解interfacePhotoSelectOptions{maxSelectNumber:number// 最大选择数量MIME?:string[]// 文件类型过滤isEdit?:boolean// 是否允许编辑}2.2 实际配置参数本项目值说明maxSelectNumber1一次分析一张笔迹图片MIME未指定默认所有图片类型isEdit未指定选择后不编辑2.3 扩展配置示例// 多选 MIME 过滤constpickerOptions:photoAccessHelper.PhotoSelectOptions{maxSelectNumber:9,MIME:[image/jpeg,image/png],}三、PhotoSelectResult 结果处理3.1 返回结构interfacePhotoSelectResult{photoUris:string[]// 所选图片的 URI 列表}3.2 URI 的使用result.photoUris[0]// 返回类似content://media/external/images/media/12345// 或/data/storage/el2/base/files/...// 这个 URI 可以直接用于// 1. image.createImageSource(uri) — 解码图像// 2. Image(uri) — ArkUI 图片组件展示// 3. fs.openSync(uri) — 文件操作四、拍照/相册双模式切换4.1 模式切换策略CapturePage 支持两种来源——拍照和相册通过source参数控制aboutToAppear(){// 从路由参数读取来源constparamsthis.getUIContext().getRouter().getParams()asRecordstring,Objectif(paramstypeofparams[source]string){this.sourceparams[source]asstring}if(this.sourcegallery){this.pickFromAlbum()// → 相册模式}else{this.initCamera()// → 相机模式}}4.2 触发来源// 跳转到 CapturePage — 拍照模式this.getUIContext().getRouter().pushUrl({url:pages/CapturePage,params:{source:camera}})// 跳转到 CapturePage — 相册模式this.getUIContext().getRouter().pushUrl({url:pages/CapturePage,params:{source:gallery}})4.3 UI 中的相册入口在拍照页面底部用户也可以点击相册按钮随时切换到相册选择// 拍照模式底栏中的相册按钮Text().fontSize(22).fontColor(rgba(255,255,255,0.8)).onClick(()this.pickFromAlbum())五、MediaLibraryKit 的其他能力5.1 获取相册列表asyncfunctiongetAlbums():PromisephotoAccessHelper.Album[]{consthelperphotoAccessHelper.getPhotoAccessHelper(getContext(this))constalbumsawaithelper.getAlbums(photoAccessHelper.AlbumType.USER,photoAccessHelper.AlbumSubtype.USER_GENERIC)returnalbums}5.2 保存图片到相册import{photoAccessHelper}fromkit.MediaLibraryKitasyncfunctionsaveToAlbum(uri:string):Promisevoid{consthelperphotoAccessHelper.getPhotoAccessHelper(getContext(this))// 将文件添加到系统相册awaithelper.addAsset(uri)}六、PhotoViewPicker vs 自定义相册对比PhotoViewPicker项目使用自定义相册实现复杂度低3 行代码高权限 查询 UIUI 一致性系统原生相册自定义 UI多选支持✅ 内置需要自行实现权限要求自动处理需要 MANAGE_MEDIA推荐场景快速集成需定制 UI 的场景七、路径与 URI 的处理7.1 路径统一拍照和相册选择的图片路径格式不同但后续处理方式一致// 拍照文件系统路径this.previewPath/data/storage/el2/base/cache/capture_${Date.now()}.jpg// 相册content:// URIthis.previewPathresult.photoUris[0]// content://media/...// 两种路径传入 AnalyzingPage 后的使用constimagePathAppStorage.getstring(capture_image_path)??awaitHandwritingDao.create({image_path:imagePath,// 原样保存路径// ...})7.2 路径格式统一化privatenormalizePath(uri:string):string{if(uri.startsWith(content://)){// content:// URI → 复制到应用缓存目录// 这需要读取文件内容并写入临时目录returnuri// 项目当前直接使用 URI}returnuri// 已经是文件路径}八、权限相关8.1 相册读取权限使用 PhotoViewPicker 不需要申请ohos.permission.READ_MEDIA权限——系统选择器自动处理了授权。但如果使用photoAccessHelper的其他 API如遍历相册则需要声明权限{ requestPermissions: [ { name: ohos.permission.READ_MEDIA, reason: $string:media_permission_reason, usedScene: { abilities: [EntryAbility], when: inuse } } ] }8.2 权限对比场景需要权限权限声明PhotoViewPicker.select()❌ 不需要系统选择器自带授权photoAccessHelper.getAlbums()✅ 需要ohos.permission.READ_MEDIAphotoAccessHelper.addAsset()✅ 需要ohos.permission.WRITE_MEDIA总结本文从 CapturePage 的pickFromAlbum()方法出发完整解析了鸿蒙 PhotoViewPicker 的使用基本使用new PhotoViewPicker()→select(options)→result.photoUris选项配置maxSelectNumber控制选择数量双模式切换通过source参数在拍照/相册间切换URI 处理拍照返回文件路径相册返回 content:// URI权限优势PhotoViewPicker 不需要额外权限声明下一篇文章将介绍图片压缩与本地存储——在保存图片时的质量和大小优化。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力参考资源PhotoViewPicker API[CapturPage 相册选择源码](file:///Users/fiona/Downloads/bijixinli/harmony-app/entry/src/main/ets/pages/CapturePage.ets)photoAccessHelper 开发指南kit.MediaLibraryKit 模块media 权限声明HarmonyOS 开发文档九、PhotoViewPicker 完整功能扩展9.1 多选图片场景asyncfunctionpickMultipleImages():Promisestring[]{constphotoPickernewphotoAccessHelper.PhotoViewPicker()constoptions:photoAccessHelper.PhotoSelectOptions{maxSelectNumber:9,// 最多选 9 张MIME:[image/jpeg,image/png,image/heif]// 仅图片格式}constresultawaitphotoPicker.select(options)returnresult.photoUris??[]}9.2 DocumentViewPicker选择文档除了图片鸿蒙还提供了 DocumentViewPicker 用于选择文档文件import{picker}fromkit.CoreFileKitasyncfunctionpickDocument():Promisestring{constdocumentPickernewpicker.DocumentViewPicker()constoptions:picker.DocumentSelectOptions{maxSelectNumber:1,fileSuffixFilters:[.pdf,.txt,.docx]// 只显示指定后缀的文件}constresultawaitdocumentPicker.select(options)returnresult[0]??}9.3 URI 转文件路径相册 URIcontent://需要通过fs.open获取文件描述符才能读取importfsfromohos.file.fsasyncfunctionreadImageFromUri(uri:string):PromiseArrayBuffer{// 通过 URI 打开文件constfilefs.openSync(uri,fs.OpenMode.READ_ONLY)// 获取文件大小conststatfs.statSync(file.fd)// 读取文件内容constbuffernewArrayBuffer(stat.size)fs.readSync(file.fd,buffer)fs.closeSync(file)returnbuffer}9.4 相册访问能力对比功能PhotoViewPickerphotoAccessHelperDocumentViewPicker选择图片✅❌需权限查询❌选择文档❌❌✅遍历相册❌✅需 READ_MEDIA❌保存到相册❌✅需 WRITE_MEDIA❌权限要求无需额外权限需要 READ_MEDIA无需额外权限推荐场景用户主动选择程序化批量访问用户选择文档9.5 相册操作完整代码模板// 完整的相册选择 图片处理模板Componentstruct ImagePickerDemo{StateselectedImageUri:stringStateisLoading:booleanfalseprivateasyncpickAndProcess():Promisevoid{this.isLoadingtruetry{// ① 选择图片constpickernewphotoAccessHelper.PhotoViewPicker()constresultawaitpicker.select({maxSelectNumber:1})if(!result.photoUris||result.photoUris.length0)returnconsturiresult.photoUris[0]// ② 解码 PixelMapconstsourceimage.createImageSource(uri)constpixelMapawaitsource.createPixelMap({desiredSize:{width:1024,height:1024}})// ③ 压缩保存到缓存constoutputPath${getContext(this).cacheDir}/selected_${Date.now()}.jpgconstpackerimage.createImagePacker()constbufferawaitpacker.packing(pixelMap,{format:image/jpeg,quality:85})constfilefs.openSync(outputPath,fs.OpenMode.CREATE|fs.OpenMode.WRITE_ONLY)fs.writeSync(file.fd,buffer)fs.closeSync(file)// ④ 释放内存pixelMap.release()this.selectedImageUrioutputPath}catch(err){hilog.error(0x0000,ImagePicker,选图失败: %s,JSON.stringify(err))}finally{this.isLoadingfalse}}build(){Column(){if(this.selectedImageUri){Image(this.selectedImageUri).width(200).height(200).objectFit(ImageFit.Cover)}Button(从相册选择).onClick(()this.pickAndProcess())}}}如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力

相关新闻

技术专访|首席GEO落地工程师、名九至天人网络创始人罗长才:基于合规数据体系构建AI推荐入口全域抢占工程框架

技术专访|首席GEO落地工程师、名九至天人网络创始人罗长才:基于合规数据体系构建AI推荐入口全域抢占工程框架

受访嘉宾:罗长才|名九至天人网络创始人、首席 GEO 落地工程师、生成式引擎优化工程化体系搭建者 专访主题:从信息分发范式迭代视角,拆解合规数据驱动型 GEO 架构、四阶标准化落地流程、行业场景适配体系与量化迭代评估机制 导语 …

2026/7/11 7:05:04 阅读更多 →
Cocos Creator 3.8.x集成Tiled地图:原理、实现与性能优化全解析

Cocos Creator 3.8.x集成Tiled地图:原理、实现与性能优化全解析

1. 项目概述:为什么要在Cocos Creator里折腾Tiled地图?如果你做过2D游戏,尤其是平台跳跃、RPG或者策略类,大概率听说过甚至用过Tiled地图编辑器。它是个开源、强大且免费的工具,让美术和策划能直观地拼接瓦片&#xff…

2026/7/11 7:05:04 阅读更多 →
MIDI 音高 60-84 五线谱映射:3个八度区间的音符位置与频率对照表

MIDI 音高 60-84 五线谱映射:3个八度区间的音符位置与频率对照表

MIDI音高60-84五线谱全解析:从数字到音符的完整映射指南当你第一次接触数字音乐制作时,可能会被那些看似随机的数字搞糊涂——为什么这个音符在代码里是60,那个是72?它们对应到五线谱上又在哪里?本文将为你彻底解开MID…

2026/7/11 7:01:03 阅读更多 →

最新新闻

VAR视觉自回归模型实战:从原理到完整图像生成Pipeline搭建

VAR视觉自回归模型实战:从原理到完整图像生成Pipeline搭建

1. 项目概述:为什么VAR模型值得你花时间? 最近在图像生成圈子里,除了Stable Diffusion、DALL-E这些耳熟能详的名字,一个叫VAR的视觉自回归模型开始被越来越多的人讨论。你可能在GitHub上看到过相关的仓库,或者在技术论…

2026/7/11 7:47:15 阅读更多 →
WK2124 vs WK2168 vs WK2204:3款SPI串口扩展芯片选型与性能对比

WK2124 vs WK2168 vs WK2204:3款SPI串口扩展芯片选型与性能对比

WK2124 vs WK2168 vs WK2204:嵌入式系统多串口扩展芯片深度选型指南1. 多串口扩展芯片的市场需求与技术背景在现代嵌入式系统设计中,串口资源不足是一个普遍存在的痛点问题。无论是工业控制、智能家居还是车载电子领域,开发者经常面临主控MCU…

2026/7/11 7:47:15 阅读更多 →
TMC7300有刷直流电机驱动与PIC18F26K80控制方案

TMC7300有刷直流电机驱动与PIC18F26K80控制方案

1. 有刷直流电机控制基础与TMC7300特性解析有刷直流电机(Brushed DC Motor)作为最古老的电机类型之一,凭借其简单的结构和低廉的成本,至今仍在各种消费电子、工业设备和汽车应用中广泛使用。与无刷电机相比,有刷电机通…

2026/7/11 7:45:15 阅读更多 →
彻底释放Mac存储空间:Pearcleaner智能清理工具完全指南

彻底释放Mac存储空间:Pearcleaner智能清理工具完全指南

彻底释放Mac存储空间:Pearcleaner智能清理工具完全指南 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 你是否曾经为Mac电脑的存储空间不足而烦恼…

2026/7/11 7:45:15 阅读更多 →
HQQ 量化方案详解——无需标定数据的极速 INT4/INT2 量化

HQQ 量化方案详解——无需标定数据的极速 INT4/INT2 量化

HQQ 量化方案详解——无需标定数据的极速 INT4/INT2 量化 一、标定数据——量化流程中被忽视的"软性依赖" 传统的模型量化方案(GPTQ、AWQ、SmoothQuant)在执行量化之前,几乎都依赖一个共同的步骤:标定(Cal…

2026/7/11 7:43:14 阅读更多 →
AI模型部署实战:从生成式与判别式原理到本地与云端技术选型

AI模型部署实战:从生成式与判别式原理到本地与云端技术选型

最近关于AI模型访问限制的讨论在技术圈引起了广泛关注。作为开发者,我们更关心的是这些变化对实际开发工作会产生什么影响。今天我们不讨论政策本身,而是从技术角度深入分析AI模型的核心价值、部署方式以及开发者如何在这个快速变化的生态中找到自己的定…

2026/7/11 7:39:13 阅读更多 →

日新闻

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要让AI图像生成真正听从你的指挥吗&…

2026/7/11 0:02:12 阅读更多 →
PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

1. 项目背景与核心需求 在工业控制、安防系统和智能家居等领域,可靠的声音警报系统是不可或缺的基础组件。传统蜂鸣器存在音量不足、音质模糊等问题,而基于压电陶瓷技术的EPT-14A4005P蜂鸣器配合PIC18F45K42微控制器,能够构建一套适应性强、音…

2026/7/11 0:04:12 阅读更多 →
大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm Attention 的 CUDA Kernel 手写与验证 一、GPU 利用率 30%:分开的算子吃掉所有带宽 推理服务的 GPU 利用率监测显示一个反直觉的现象:计算核心(SM)利用率不到 30%,但…

2026/7/11 0:04:12 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/10 19:03:29 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻