鸿蒙截图与保存到相册的实现步骤_鸿蒙 保存文件到相册
第一步:截图组件并打包二进制流
给目标组件设置唯一id,调用componentSnapshot.get()
获取组件截图。该函数返回Promise,使用await
获取截图数据对象。通过ImagePacker
实例的packing()
方法将截图转为二进制流,参数包括目标组件、文件格式(如png
或jpg
)和清晰度(quality
值)。
const res = await componentSnapshot.get(\'share\') const packer = image.createImagePacker() const arrayBuffer = await packer.packing(res, { format: \'image/jpeg\', quality: 70 })
第二步:写入本地文件
通过上下文获取缓存目录路径(context.cacheDir
),拼接文件名生成完整路径。使用fileIo.openSync
创建/打开文件,writeSync
写入二进制流数据,最后调用closeSync
关闭文件。
const ctx = getContext() const imagePath = ctx.cacheDir + \'/\' + Date.now() + \'.jpeg\' const imgFile = fileIo.openSync(imagePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE) fileIo.writeSync(imgFile.fd, arrayBuffer) fileIo.closeSync(imgFile.fd) promptAction.showToast({ message: \'图片已存储到缓存\' + fileUri.getUriFromPath(imagePath) })
第三步:保存到系统相册
获取相册权限后,使用fileUri.getUriFromPath
转换本地文件路径为URI。通过photoAccessHelper.MediaAssetChangeRequest.createImageAssetRequest
创建图片变更请求,传入上下文和文件URI。调用photoAccessHelper.getPhotoAccessHelper
获取助手实例,执行applyChanges
提交变更请求。
const imageUri = fileUri.getUriFromPath(imagePath) const request = photoAccessHelper.MediaAssetChangeRequest.createImageAssetRequest(ctx, imageUri) const helper = photoAccessHelper.getPhotoAccessHelper(ctx) await helper.applyChanges(request) promptAction.showToast({ message: \'已保存到本地相册\' }) this.controller.close()
第四步:权限处理
若仅需临时权限,使用SaveButton
组件触发保存操作,并在其回调中检查权限状态。权限授予成功后,执行截图和保存流程。
SaveButton({ text: SaveDescription.SAVE_IMAGE, buttonType: ButtonType.Normal, icon: SaveIconStyle.FULL_FILLED})
关键代码示例
// 截图与打包const snapshot = await componentSnapshot.get(\'componentId\');const packer = new image.ImagePacker();const binaryData = await packer.packing(snapshot, { format: \'image/jpeg\', quality: 100 });// 写入文件const filePath = context.cacheDir + \'/screenshot.jpg\';let file = fileIo.openSync(filePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE);fileIo.writeSync(file.fd, binaryData);fileIo.closeSync(file);// 保存到相册const photoUri = fileUri.getUriFromPath(filePath);const request = photoAccessHelper.MediaAssetChangeRequest.createImageAssetRequest(context, photoUri);const helper = photoAccessHelper.getPhotoAccessHelper(context);await helper.applyChanges(request);
注意事项
- 相册操作需在
ohos.permission.READ_IMAGEVIDEO
和ohos.permission.WRITE_IMAGEVIDEO
权限授权后进行。 - 文件路径需确保可访问,临时文件建议存储在
cacheDir
或tempDir
目录。