HarmonyOS 保存图片到系统相册

HarmonyOS
2024-12-27 17:04:36
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
aquaa

保存到相册可通过以下方法

1.先创建图片文件,并获取图片uri

2.打开文件

3.通过buffer将数据写到文件中

//Index.ets
import photoAccessHelper from '@ohos.file.photoAccessHelper';
import fs from '@ohos.file.fs';
​
@Entry
@Component
struct Index {
  @State message: string = 'Hello World'
  ​
  ​
  build() {
    Row() {
      Column() {
        Image($r('app.media.icon'))
          .height(300)
          .width(300)
        SaveButton().onClick(async (_event: ClickEvent, result: SaveButtonOnClickResult) => {
          if (result == SaveButtonOnClickResult.SUCCESS) {
            try {
              const context = getContext(this);
              let helper = photoAccessHelper.getPhotoAccessHelper(context);
              // onClick触发后5秒内通过createAsset接口创建图片文件,5秒后createAsset权限收回。
              let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg');
              // 使用uri打开文件,可以持续写入内容,写入过程不受时间限制
              let file = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
              try {
                context.resourceManager.getMediaContent($r('app.media.startIcon').id, 0)
                  .then(async value => {
                    let media = value.buffer;
                    // 写到媒体库文件中
                    await fs.write(file.fd, media);
                    await fs.close(file.fd);
                    AlertDialog.show({message:'已保存至相册!'});
                  });
              }
              catch (err) {
                console.error("error is "+ JSON.stringify(err))
              }
            } catch (error) {
              console.error("error is "+ JSON.stringify(error));
            }
          }
          else {
            AlertDialog.show({ message: "设置权限失败" })
          }
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}

使用http模块下的request方法下载图片,并在该方法的回调函数中保存到相册

先申请以下权限:

ohos.permission.INTERNET

ohos.permission.WRITE_IMAGEVIDEO 其中ohos.permission.WRITE_IMAGEVIDEO需要向用户申请授权,可参考文档

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/request-user-authorization-V5

保存网络图片代码如下:

import { http } from '@kit.NetworkKit'
import { BusinessError } from '@kit.BasicServicesKit';
import ResponseCode from '@ohos.net.http';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import fs from '@ohos.file.fs';

@Entry
@Component
struct Index {
  loadImageWithUrl(url: string) {
    // 使用request下载图片并在回调函数中保存图片到相册
    http.createHttp().request(url,
      {
        method:http.RequestMethod.GET,
        connectTimeout:60000,
        readTimeout:60000
      },
      async (error: BusinessError, data: http.HttpResponse) => {
        if (error) {
          console.error(`http reqeust failed with. Code: ${error.code}, message: ${error.message}`);
        } else {
          if (ResponseCode.ResponseCode.OK === data.responseCode) {
            let imageBuffer: ArrayBuffer = data.result as ArrayBuffer;
            try {
              // 获取相册路径
              const context = getContext(this);
              let helper = photoAccessHelper.getPhotoAccessHelper(context);
              let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg')
              let file = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
              // 写入文件
              await fs.write(file.fd, imageBuffer);
              // 关闭文件
              await fs.close(file.fd);
            } catch (error) {
              console.error("error is "+ JSON.stringify(error))
            }
          } else {
            console.error("error occurred when image downloaded!")
          }
        }
      })
  }
  ......
}

保存本地图片到相册的方法

let context: Context = getContext(this);
// 获取待保存图像的ArrayBuffer
const resourceMgr: resourceManager.ResourceManager = context.resourceManager;
const fileData: Uint8Array = await resourceMgr.getRawFileContent('beer.jpeg');
const buffer = fileData.buffer;

// 获取相册的保存路径
let helper = photoAccessHelper.getPhotoAccessHelper(context);
let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpeg');
let file = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);

// 写入文件并关闭文件流
await fs.write(file.fd, buffer);
await fs.close(file.fd);
分享
微博
QQ
微信
回复
2024-12-27 19:41:46
相关问题
HarmonyOS保存图片系统相册问题咨询
1088浏览 • 1回复 待解决
HarmonyOS 保存图片本地相册
423浏览 • 1回复 待解决
HarmonyOS 保存图片相册问题
765浏览 • 1回复 待解决
HarmonyOS 截图保存图片相册
406浏览 • 1回复 待解决
HarmonyOS 实现保存图片相册
557浏览 • 1回复 待解决
HarmonyOS 保存图片相册权限问题
666浏览 • 1回复 待解决
如何保存网络图片相册
1267浏览 • 1回复 待解决
如何保存本地图片相册
1614浏览 • 1回复 待解决
求大佬告知如何保存图片相册
1718浏览 • 1回复 待解决
怎么实现保存网络图片相册功能?
1089浏览 • 1回复 待解决
HarmonyOS h5如何实现保存图片相册
499浏览 • 1回复 待解决
如何保存一张PNG图片相册
2302浏览 • 1回复 待解决
HarmonyOS 图片保存相册
222浏览 • 1回复 待解决
HarmonyOS H5页面保存图片本地相册
398浏览 • 1回复 待解决
HarmonyOS图片保存相册问题
1047浏览 • 1回复 待解决
鸿蒙开发保存页面相册
6990浏览 • 1回复 待解决
HarmonyOS 图片保存相册报错
525浏览 • 1回复 待解决