arkts-保存图片到图库,读取图库图片到项目缓存目录

148 阅读1分钟

1.保存图片到图库

因为鸿蒙限制了图库权限的申请,其他移动端如Android常规保存逻辑由
获取图库权限-读保存的图片数据-写入到图库-通知系统刷新图库
变更为 使用官方安全组件 SaveButton 进行保存,保存完毕后图库会自动刷新

1.保存项目图片到本地,即通过 $r("app.media.xxx") 获取的 Resource 类型,使用 saveResourceToAlbum() 方法保存
2.保存组件截图到图库,即通过 componentSnapshot.get("key",()=>{}) 获取的 pixelMap,使用 savePixelMapToAlbum() 保存到图库
3.保存网络图片到图库,如 http 库 下载的图片,data.result as ArrayBuffer ,使用 saveArrayBufferToAlbum() 保存到图库
具体实现代码为:

import { image } from '@kit.ImageKit';
import { media } from '@kit.MediaKit';
import { fileIo } from '@kit.CoreFileKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';

/**
 * 保存 resource 图片到图库
 * 注意:此方法调用需要在 saveButton 的 onClick 中进行
 * @param context 上下文
 * @param resource $r("app.media.xxxx")
 * @param end 后缀名,如:"png","jpeg" 等
 */
static async saveResourceToAlbum(context: Context, resource: Resource, end: string) {
  const arr = await context.resourceManager.getMediaContent(resource)
  await ImageUtils.saveArrayBufferToAlbum(context, arr.buffer as ArrayBuffer, end)
}

 /**
 * 保存 arrayBuffer 图片到图库
 * 注意:此方法调用需要在 saveButton 的 onClick 中进行
 * @param context 上下文
 * @param end 后缀名,如:"png","jpeg" 等
 */
static async saveArrayBufferToAlbum(context: Context, buffer: ArrayBuffer, end: string) {
  const helper = photoAccessHelper.getPhotoAccessHelper(context);
  const uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, end)
  let resFile = await fileIo.open(uri, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE)
  await fileIo.write(resFile.fd, buffer)
  await fileIo.close(resFile.fd)
  ToastUtil.showToast("已保存至图库")
}

2.读取图库图片到项目缓存目录

同 1. 一样,由于权限限制,所以使用官方安全组件 PhotoPickerComponent 无需申请权限即可获取用户选择的对应图片的操作权限。
备注:用户选择图片完毕且点击确定后,有10秒对于所选图片的操作权限,10秒之后权限会被撤销。