有人知道HarmonyOS Next当访问网络图片uri时,是否有保存网络图片的API吗 ?

如题:HarmonyOS 当访问网络图片uri时,是否有保存网络图片的API

阅读 514
avatarAI BotBETA

在HarmonyOS中,当需要访问并保存网络图片时,虽然直接提供保存网络图片到本地存储的API可能不如Android或iOS那样直观,但你可以通过一系列步骤来实现这一功能。HarmonyOS提供了网络请求和文件存储的API,你可以结合这些API来下载并保存网络图片。

以下是一个大致的步骤和示例代码片段,用于指导你如何实现这一功能:

  1. 发起网络请求获取图片数据
    你可以使用HarmonyOS提供的网络请求API(如HttpURLConnection或更高级的库如OkHttp,如果HarmonyOS支持的话)来下载网络图片。
  2. 将图片数据写入到本地文件
    下载完成后,你可以使用文件存储API(如FileOutputStream)将图片数据写入到本地存储中。

示例代码(注意:以下代码是伪代码,需要根据HarmonyOS的具体API进行调整):

// 假设你已经有了一个图片的URL
String imageUrl = "http://example.com/image.jpg";

// 第一步:下载图片数据
// 这里使用HttpURLConnection作为示例,具体实现可能需要根据HarmonyOS的API进行调整
HttpURLConnection connection = (HttpURLConnection) new URL(imageUrl).openConnection();
connection.setRequestMethod("GET");
InputStream inputStream = connection.getInputStream();

// 第二步:将图片数据保存到本地
// 假设你要保存到的文件路径
String filePath = "/sdcard/Download/image.jpg"; // 注意:实际路径需要根据HarmonyOS的文件系统进行调整
FileOutputStream outputStream = new FileOutputStream(filePath);

// 读取输入流并写入到输出流中
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
    outputStream.write(buffer, 0, bytesRead);
}

// 关闭流
inputStream.close();
outputStream.close();

// 图片保存完成

注意

  • 上述代码中的URL、文件路径和文件操作API(如FileOutputStream)可能需要根据HarmonyOS的实际API进行调整。
  • 确保你的应用有权限访问网络和存储系统,这可能需要在应用的配置文件或运行时请求权限。
  • HarmonyOS的API可能与其他平台(如Android)有所不同,因此建议查阅最新的HarmonyOS开发文档以获取准确的实现方法。

综上所述,虽然HarmonyOS没有直接提供保存网络图片的API,但你可以通过组合使用网络请求和文件存储的API来实现这一功能。

1 个回答

需要先使用http的request方式,下载文件。再将文件转成pixelMap的arrayBuffer,最后使用photoAccessHelper.getPhotoAccessHelper提供的访问相册接口,将文件存入本地

import { BusinessError, request, zlib } from '@kit.BasicServicesKit'; 
import { abilityAccessCtrl, common, Permissions } from '@kit.AbilityKit'; 
import fs from '@ohos.file.fs'; 
import { image } from '@kit.ImageKit'; 
import { photoAccessHelper } from '@kit.MediaLibraryKit'; 
import { http } from '@kit.NetworkKit'; 
import { promptAction } from '@kit.ArkUI'; 
import ResponseCode from '@ohos.net.http'; 
import { picker } from '@kit.CoreFileKit'; 
 
 
let context = getContext(this) as common.UIAbilityContext; 
let filesDir = context.filesDir 
const PERMISSIONS: Array<Permissions> = [ 
  'ohos.permission.READ_MEDIA', 
  'ohos.permission.WRITE_MEDIA' 
]; 
 
@Entry 
@Component 
struct Index { 
  @State image: PixelMap | undefined = undefined; 
  @State photoAccessHelper: photoAccessHelper.PhotoAccessHelper | undefined = undefined; // 相册模块管理实例 
  @State imageBuffer: ArrayBuffer | undefined = undefined; // 图片ArrayBuffer 
 
  /** 
   * 通过http的request方法从网络下载图片资源 
   */ 
  async getPicture() { 
    http.createHttp() 
      .request('https://xxx.com/harmonyos-cases/cases/raw/master/CommonAppDevelopment/feature/variablewatch/src/main/resources/base/media/grape.png', 
        (error: BusinessError, data: http.HttpResponse) => { 
          if (error) { 
            // 下载失败时弹窗提示检查网络,不执行后续逻辑 
            console.info("error") 
            return; 
          } 
          this.transcodePixelMap(data); 
          // 判断网络获取到的资源是否为ArrayBuffer类型 
          if (data.result instanceof ArrayBuffer) { 
            this.imageBuffer = data.result as ArrayBuffer; 
          } 
        } 
      ) 
  } 
 
  /** 
   * 使用createPixelMap将ArrayBuffer类型的图片装换为PixelMap类型 
   * @param data:网络获取到的资源 
   */ 
  transcodePixelMap(data: http.HttpResponse) { 
    if (ResponseCode.ResponseCode.OK === data.responseCode) { 
      const imageData: ArrayBuffer = data.result as ArrayBuffer; 
      // 通过ArrayBuffer创建图片源实例。 
      const imageSource: image.ImageSource = image.createImageSource(imageData); 
      const options: image.InitializationOptions = { 
        'alphaType': 0, // 透明度 
        'editable': false, 
        'pixelFormat': 3, // 像素格式 
        'scaleMode': 1, // 缩略值 
        'size': { height: 100, width: 100 } 
      }; // 创建图片大小 
 
      // 通过属性创建PixelMap 
      imageSource.createPixelMap(options).then((pixelMap: PixelMap) => { 
        this.image = pixelMap; 
      }); 
    } 
  } 
 
  /** 
   * 保存ArrayBuffer到图库 
   * @param buffer:图片ArrayBuffer 
   * @returns 
   */ 
  async saveImage(buffer: ArrayBuffer | string): Promise<void> { 
    const context = getContext(this) as common.UIAbilityContext; // 获取getPhotoAccessHelper需要的context 
    const helper = photoAccessHelper.getPhotoAccessHelper(context); // 获取相册管理模块的实例 
    const uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg'); // 指定待创建的文件类型、后缀和创建选项,创建图片或视频资源 
    const file = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); 
    await fs.write(file.fd, buffer); 
    await fs.close(file.fd); 
  } 
 
  /** 
   * 保存ArrayBuffer到用户选择的路径 
   * @param buffer:图片ArrayBuffer 
   * @returns 
   */ 
  async pickerSave(buffer: ArrayBuffer | string): Promise<void> { 
    const photoSaveOptions = new picker.PhotoSaveOptions(); // 创建文件管理器保存选项实例 
    photoSaveOptions.newFileNames = ['PhotoViewPicker ' + new Date().getTime() + '.jpg']; // 保存文件名(可选) 
    const photoViewPicker = new picker.PhotoViewPicker; 
    photoViewPicker.save(photoSaveOptions) 
      .then(async (photoSvaeResult) => { 
        const uri = photoSvaeResult[0]; 
        const file = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); 
        await fs.write(file.fd, buffer); 
        await fs.close(file.fd); 
        promptAction.showToast({ 
          message: "save", 
          duration: 2000 
        }) 
      }); 
  } 
 
  async aboutToAppear(): Promise<void> { 
    const context = getContext(this) as common.UIAbilityContext; 
    const atManager = abilityAccessCtrl.createAtManager(); 
    await atManager.requestPermissionsFromUser(context, PERMISSIONS); 
    this.getPicture(); 
  } 
 
  build() { 
    Column() { 
      Column() { 
        Text('title') 
          .fontSize(14) 
          .fontWeight(FontWeight.Me) 
          .margin({ bottom: 40}) 
        Text('content') 
      } 
      .backgroundColor(Color.White) 
      .borderRadius(14) 
      .padding(40) 
 
      Image(this.image) 
        .objectFit(ImageFit.Contain) 
        .width('50%') 
        .height(200) 
 
      SaveButton() 
        .width(200) 
        .onClick(async () => { 
          if (this.imageBuffer !== undefined) { 
            await this.saveImage(this.imageBuffer); 
            promptAction.showToast({ 
              message: 'success', 
              duration: 2000 
            }) 
          } 
        }) 
 
      Button('picker_save') 
        .margin({ top: 40 }) 
        .height(40) 
        .onClick(async () => { 
          if (this.imageBuffer !== undefined) { 
            this.pickerSave(this.imageBuffer); 
          } 
        }) 
    } 
    .height('100%') 
    .margin(40) 
  } 
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题