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秒之后权限会被撤销。