HarmonyOS 如何实现存储多张图片到图库

目前ohos.permission.WRITE_IMAGEVIDEO权限不能用,使用savebutton只能通过photoAccessHelper.createAsset存一张,使用PhotoViewPicker.save只能存到文件系统里面去。 目前没有一种方案是可行的,是平台以后禁止存多图到图库的行为还是说有其他的方案。

HarmonyOS
2024-12-25 16:10:43
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zxjiu

可以通过fileIo.write将数据写入文件,使用Promise异步回调实现。

具体可参考文档https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-fileio-V5#fileiowrite

此demo仅以系统资源为例,事实上任何可以获得arraybuffer的图片都可以作为使用此方法保存。

参考demo:

import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { fileIo } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';
import { promptAction } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

async function savePhotoToGallery(context: common.UIAbilityContext) {
  let helper = photoAccessHelper.getPhotoAccessHelper(context);
  try {
    let uri:Array<string>=[]
    let res:Array<Resource>=[$r('app.media.startIcon'),$r('app.media.ic_tabs_icon_selected')]
    // onClick触发后5秒内通过createAsset接口创建图片文件,5秒后createAsset权限收回。
    //5s内保存十张图片完全来得及,建议一次最多允许20到30张图片
    for(let i=0;i<2;i++){
      uri.push(await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'png'))
    }
    // 使用uri打开文件,可以持续写入内容,写入过程不受时间限制
    for(let i=0;i<10;i++){
      let urli=uri[i]
      let file = await fileIo.open(urli, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);

      context.resourceManager.getMediaContent(res[i].id, 0)
        .then(async value => {
          let media = value.buffer;//改成想要保存的图片的buffer,
          // 写到媒体库文件中
          await fileIo.write(file.fd, media);//fileIO的操作没有时间限制,
          await fileIo.close(file.fd);
        });
    }
    promptAction.showToast({ message: '已保存至相册!' });
  }
  catch (error) {
    const err: BusinessError = error as BusinessError;
    console.error("Failed to save photo. Code is "+err.code+", message is "+err.message);
  }
}
@Entry
@Component
struct Index {
  build() {
    Row() {
      Column({ space: 10 }) {
        Image($r('app.media.startIcon'))
          .height(200)
          .width(200)
          .borderRadius(100)
        SaveButton({text:    SaveDescription.DOWNLOAD}).onClick(async (event: ClickEvent, result: SaveButtonOnClickResult) => {
          if (result === SaveButtonOnClickResult.SUCCESS) {
            const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
            savePhotoToGallery(context);
          } else {
            promptAction.showToast({ message: '设置权限失败!' })
          }
        })
          .borderRadius(100)
      }
      .width('100%')
    }
    .height('100%')
    .backgroundColor(0xF1F3F5)
  }
}
分享
微博
QQ
微信
回复
2024-12-25 19:37:48
相关问题
HarmonyOS axios如何上传多张图片
253浏览 • 1回复 待解决
HarmonyOS 实现保存图片相册
430浏览 • 1回复 待解决
HarmonyOS 多张图片拼接为一张
386浏览 • 1回复 待解决
HarmonyOS 如何拉起图库中的指定图片
168浏览 • 1回复 待解决
HarmonyOS 多张string图片合并成一张
246浏览 • 1回复 待解决
HarmonyOS 多张画布横向合成一张图片
240浏览 • 1回复 待解决
HarmonyOS h5如何实现保存图片相册
348浏览 • 1回复 待解决
HarmonyOS 如何把文件存储公共目录
295浏览 • 1回复 待解决
HarmonyOS 保存网络图片图库更新
520浏览 • 1回复 待解决
使用imageSource如何存储图片
613浏览 • 1回复 待解决
分布式如何读写图库图片或者视频?
4810浏览 • 1回复 待解决