ImageDownloadComponent.ets 7.04 KB
import { abilityAccessCtrl, common, Permissions } from '@kit.AbilityKit';
import { http } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { promptAction } from '@kit.ArkUI';
import { image } from '@kit.ImageKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import fs from '@ohos.file.fs';
import { DateTimeUtils, NetworkUtil, PermissionUtil, PermissionUtils } from 'wdKit';
import { PrivacySettingModel } from '../model/PrivacySettingModel';
import { TrackConstants, TrackingButton } from 'wdTracking';
import { faceDetector } from '@kit.CoreVisionKit';
// import mediaLibrary from '@ohos.multimedia.mediaLibrary';
import fileIo from '@ohos.file.fs';
import { httpRequest } from '../utils/httpRequest';
import { taskpool } from '@kit.ArkTS';

const PERMISSIONS: Array<Permissions> = [
  'ohos.permission.READ_IMAGEVIDEO',
  'ohos.permission.WRITE_IMAGEVIDEO'
];

/*
 * saveButton参考文档
 * https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/savebutton-0000001820999677
 * */
@Concurrent
async function getPicture(imageUrl: string): Promise<ArrayBuffer> {
  let ret: ArrayBuffer = await new Promise((resolve, reject) => {
    httpRequest.httpRequestInStream(imageUrl, (res: ArrayBuffer) => {
      resolve(res); // 成功时解析Promise
    }, () => {
      // 下载失败时弹窗提示检查网络
      promptAction.showToast({
        message: $r('app.string.image_request_fail'),
        duration: 2000
      });
      reject(new Error('Image download failed')); // 失败时拒绝Promise
    });
  });
  return ret
}

@Component
export struct ImageDownloadComponent {
  @State image: PixelMap | undefined = undefined;
  @State photoAccessHelper: photoAccessHelper.PhotoAccessHelper | undefined = undefined; // 相册模块管理实例
  @State imageBuffer: ArrayBuffer | undefined = undefined; // 图片ArrayBuffer
  @Prop @Watch('onChangeUrl') url: string = ''
  @State isGranted: boolean = false
  @State name: string = ''

  build() {
    Column() {
      // Image($r('app.media.save_detail_img'))
      //   .width(24)
      //   .height(24)
      //   .margin({bottom:6})
      SaveButton({ icon: SaveIconStyle.FULL_FILLED, buttonType: ButtonType.Capsule })
        .iconSize(24)
        .backgroundColor(Color.Transparent)
        .iconColor(Color.White)
        .onClick(async () => {
          //console.info(`cj2024 onClick ${this.imageBuffer}`)
          // let readGrant = await PermissionUtils.checkPermissions(PERMISSIONS[0])
          // let writeGrant = await PermissionUtils.checkPermissions(PERMISSIONS[1])
          // console.info(`cj2024 onClick readGrant ${readGrant} writeGrant ${writeGrant}`)
          // if (!readGrant && !writeGrant) {
          //   const context = getContext(this) as common.UIAbilityContext;
          //   let requestGrant = await PermissionUtils.reqPermissionsFromUser(PERMISSIONS, context);
          // } else {
          //
          // }
          if (this.imageBuffer !== undefined) {
            try {
              await this.saveImage(this.imageBuffer);
              promptAction.showToast({
                message: $r('app.string.image_request_success'),
                duration: 2000,
                alignment: Alignment.Center
              })
            } catch (error) {
              const err: BusinessError = error as BusinessError;
              //console.info(`Failed to save photo. Code is ${err.code}, message is ${err.message}`);
              if (this.isGranted) {
                promptAction.showToast({ message: '保存图片失败!' });
              }

            }
          }
        })
    }

  }

  aboutToAppear(): void {
    // 注册监听网络连接
    let netStatus = NetworkUtil.isNetConnected()
    if (netStatus) {
      // 有网络
      this.onChangeUrl()
    }

  }

  async onChangeUrl(): Promise<void> {
    //console.info(`cj2024 图片下载 ${this.url}`)
    const context = getContext(this) as common.UIAbilityContext;
    const atManager = abilityAccessCtrl.createAtManager();
    await atManager.requestPermissionsFromUser(context, PERMISSIONS);
    // 通过任务池(taskpool)从网络下载图片资源
    taskpool.execute(getPicture, this.url).then((res) => {
      const imgBuffer = res as ArrayBuffer
      this.imageBuffer = imgBuffer;
      this.transcodePixelMap(imgBuffer);
    })
  }

  /**
   * 使用createPixelMap将ArrayBuffer类型的图片装换为PixelMap类型
   * @param data:网络获取到的资源
   */
  transcodePixelMap(data: ArrayBuffer) {
    const imageData: ArrayBuffer = data;
    // 通过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> {
    console.info(`cj2024 saveImage buffer ${buffer} isGranted = ${this.isGranted}`)
    if (!this.isGranted) {
      //跳转权限设置
      // const permissionUtil = new PermissionUtil();
      PermissionUtil.reqPermissionsFromUser(['ohos.permission.READ_IMAGEVIDEO'], this).then((res) => {
        //console.info(`cj2024 saveImage res ${res}`)
        this.isGranted = res;
      });
    } else {
      // PermissionUtil.openPermissionsInSystemSettings(this);
    }


    const context = getContext(this) as common.UIAbilityContext; // 获取getPhotoAccessHelper需要的context
    // const helper = photoAccessHelper.getPhotoAccessHelper(context); // 获取相册管理模块的实例
    // const uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg'); // 指定待创建的文件类型、后缀和创建选项,创建图片或视频资源
    // //console.info(`cj2024 saveImage uri ${uri}`)
    // const file = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    // await fs.write(file.fd, buffer);
    // await fs.close(file.fd);
    // let media = mediaLibrary.getMediaLibrary(context);
    // let publicPath = await media.getPublicDirectory(mediaLibrary.DirectoryType.DIR_IMAGE);
    // let picName = DateTimeUtils.getCurDate(DateTimeUtils.PATTERN_DATE_TIME_DEFAULT) + '.jpg'
    // // //console.info(`cj2024 saveImage time ${picName}`)
    // let asset = await media.createAsset(mediaLibrary.MediaType.IMAGE, picName, publicPath);
    //
    // if (asset) {
    //   let fd = await asset.open('rw');
    //   await fileIo.write(fd, buffer);
    //   await asset.close(fd);
    //   promptAction.showToast({ message: '已保存至相册!' });
    // } else {
    //   if (this.isGranted) {
    //     promptAction.showToast({ message: '保存图片失败!' });
    //   }
    //
    //   throw new Error('Failed to create asset');
    // }
  }
}