本文面向 HarmonyOS 7 应用开发。涉及系统能力时,以项目实际安装 SDK 的 API、权限及设备支持为准;下文代码注明为局部示例,不构成完整可运行工程。

不是每个选图功能都需要遍历图库

做报销附件时,很容易先想到申请照片权限,再自己写一个相册页。但用户只是要选两张发票,并没有要求应用管理整个图库。把任务限定为“用户明确选中的照片”,接入会更轻,授权解释也更容易说清楚。

HarmonyOS 提供系统 Picker。它让用户在系统界面完成选择,应用取得选择结果并按对应授权规则访问资源。这里需要区分“本次能够读取”和“以后一直能够读取”。URI 是资源标识,不能把它简单当成一个永久存在的沙箱路径。

在这里插入图片描述

先做单张,再扩展多张

第一版建议只做图片、单选、立即预览。链路稳定后再添加多选和上传。下面是调用照片选择器的 ArkTS 局部示例,需要从页面的按钮事件调用,并在业务层处理错误:

import { photoAccessHelper } from '@kit.MediaLibraryKit';

async function chooseOnePhoto(): Promise<string | undefined> {
  const options = new photoAccessHelper.PhotoSelectOptions();
  options.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
  options.maxSelectNumber = 1;
  const picker = new photoAccessHelper.PhotoViewPicker();
  const result = await picker.select(options);
  return result.photoUris.length > 0 ? result.photoUris[0] : undefined;
}

返回空结果时维持原来的附件,不要把旧图清掉。选择接口发生异常时,向用户提供重新选择入口;不要把所有失败都解释为“未授权”,因为资源读取和文件处理也可能失败。

选图完成以后,业务才刚开始

可以把附件记录拆成四个字段:本地业务编号、资源 URI、预览状态、上传凭据。URI 负责本地读取,上传凭据负责服务器关联,两者不要混用。只有服务器确认接收,才把附件标成可提交。用户看到了缩略图,并不代表文件已经上传。

对于跨页面草稿,先决定是否确实需要保留文件副本。如果需要,在允许的访问范围内读取资源并保存到应用管理的目录,记录来源和清理时间。不要只把临时 URI 塞进偏好存储,就认为重启后必然可用;持久访问应按当前 SDK 对该类资源的授权规则单独实现。

多选时还要限制并发解码。十张大图同时展开成完整位图,会产生远高于压缩文件大小的内存占用。列表先加载小尺寸预览,点击后再读取需要的清晰度。

用四个操作验收

分别测试正常选图、取消选择、连续更换附件、选择后删除源文件。还要在真机上检查长图和高像素照片。预期结果是:取消不会破坏旧附件,换图不会出现旧预览覆盖新预览,失效资源能重新选择,上传失败仍保留可重试的业务记录。

这一篇的交付目标很具体:用户能把自己选中的一张图片,可靠地变成一条可提交的附件记录。先完成这条链路,再考虑更多图库能力。

官方参考

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐