HarmonyOS 使用savebutton保存图片至相册 必须将app关闭才能在相册中看到图片?

如题:HarmonyOS 使用savebutton保存图片至相册 必须将app关闭才能在相册中看到图片?

阅读 583
1 个回答

在图片保存成功之后要使用imagePackerApi.release()释放,demo如下:

import { resourceManager } from '@kit.LocalizationKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { image } from '@kit.ImageKit';
import { promptAction } from '@kit.ArkUI';
import { fileIo } from '@kit.CoreFileKit';

@Entry
@Component
export struct SavePixelMapToAlbum {
  @State saveButtonOptions: SaveButtonOptions = {
    icon: SaveIconStyle.FULL_FILLED,
    text: SaveDescription.SAVE,
    buttonType: ButtonType.Capsule
  };
  @State pixel: image.PixelMap | undefined = undefined;
  @State albumPath: string = '';
  @State photoSize: number = 0;
  private context: Context = getContext(this);

  async aboutToAppear() {
    const resourceMgr: resourceManager.ResourceManager = this.context.resourceManager;
    const fileData: Uint8Array = await resourceMgr.getMediaContent($r('app.media.app_icon').id);
    let buffer = new Uint8Array(fileData).buffer as object as ArrayBuffer;
    let imageResource = image.createImageSource(buffer);
    let opts: image.DecodingOptions = { editable: true };
    this.pixel = await imageResource.createPixelMap(opts);
  }

  async saveSnapshot() {
    try {
      const context = getContext(this);
      let helper = photoAccessHelper.getPhotoAccessHelper(context);
      let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'png')
      let file = await fileIo.open(uri, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE)
      // 写入文件
      const imagePackerApi: image.ImagePacker = image.createImagePacker();
      let packOpts: image.PackingOption = { format: 'image/png', quality: 100 };
      imagePackerApi.packToFile(this.pixel, file.fd, packOpts).finally(() => {
        fileIo.close(file.fd).finally(() => {
          promptAction.showToast({ message: '图片保存成功!' })
          imagePackerApi.release()
        })
      })
    } catch (error) {

    }
  }

  build() {
    Column() {
      Image(this.pixel)
        .objectFit(ImageFit.None)
        .height('30%')
      SaveButton(this.saveButtonOptions)
        .onClick(async (event, result: SaveButtonOnClickResult) => {
          if (result === SaveButtonOnClickResult.SUCCESS) {
            this.saveSnapshot()
          }
        })
    }
    .justifyContent(FlexAlign.Start)
    .height('100%')
    .width('100%')
  }
}