HarmonyOS 鸿蒙Next 将image.PixelMap类型的图片保存到本地,保存成功但是需要杀应用后台系统相册才会显示照片

发布于 1周前 作者 vueper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 将image.PixelMap类型的图片保存到本地,保存成功但是需要杀应用后台系统相册才会显示照片

将image.PixelMap类型的图片保存到本地,保存成功但是需要杀应用后台系统相册才会显示照片

参考代码:
https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-image-20-V5


更多关于HarmonyOS 鸿蒙Next 将image.PixelMap类型的图片保存到本地,保存成功但是需要杀应用后台系统相册才会显示照片的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

需要杀掉进程才可以保存成功,应该是文件资源没有释放,所以没有保存结束,当杀掉进程,自动回收资源,保存成功。

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
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.getRawFileContent('rawfile/test.png');
    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 savePixelMapToAlbum() {
    let imagePackerApi = image.createImagePacker();
    let packOpts: image.PackingOption = { format: 'image/jpeg', quality: 98 };

    imagePackerApi.packing(this.pixel, packOpts).then(async (buffer: ArrayBuffer) => {
      try {
        let helper = photoAccessHelper.getPhotoAccessHelper(this.context)
        let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'png')
        let file = await fileIo.open(uri, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE)
        await fileIo.write(file.fd, buffer);
        // 关闭文件
        await fileIo.close(file.fd);
        promptAction.showToast({ message: '已保存至相册!' });
      } catch (error) {
        console.error("保存失败:" + JSON.stringify(error))
      }
    }).catch((error: BusinessError) => {
      console.error('保存失败,失败原因: ' + error);
    })
  }

  build() {
    Row() {
      Column() {
        Image(this.pixel)
          .objectFit(ImageFit.None)
          .height('30%')

        SaveButton(this.saveButtonOptions)
          .onClick(async (event, result: SaveButtonOnClickResult) => {
            if (result === SaveButtonOnClickResult.SUCCESS) {
              this.savePixelMapToAlbum();
            }
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

更多关于HarmonyOS 鸿蒙Next 将image.PixelMap类型的图片保存到本地,保存成功但是需要杀应用后台系统相册才会显示照片的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,将image.PixelMap类型的图片保存到本地后,如果需要在不重启应用的情况下立即在系统相册中显示照片,可以通过以下方式处理:

  1. 使用MediaStore API: 在保存图片后,利用MediaStore API将图片信息插入到系统的媒体数据库中。这样,系统相册会立即检测到新图片并显示。

  2. 发送广播通知: 保存图片后,可以发送一个广播通知系统相册应用有新文件加入。这通常涉及到使用Intent和特定的Action,如Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,来触发系统扫描新文件。

  3. 确保文件路径正确: 确保保存图片的路径是系统相册能够访问的公共存储区域,而非应用的私有存储。如果是私有存储,需要确保系统相册有相应的访问权限。

  4. 文件权限: 检查并确认应用具有写入外部存储的权限,同时确保系统相册有读取该路径的权限。

通过以上方法,可以在不重启应用的情况下,使系统相册立即显示新保存的图片。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部