鸿蒙 ——选择相册图片保存到应用

photoAccessHelper

// entry/src/main/ets/utils/file.ets
import { fileIo } from '@kit.CoreFileKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { bundleManager } from '@kit.AbilityKit';

// 应用在本设备内部存储上通用的存放默认长期保存的文件路径;随应用卸载而清理。
// 可以用于保存应用的任何私有数据,主要包括用户持久性文件、图片、媒体文件以及日志文件等。此路径下存储这些数据,使得数据保持私有、安全且持久有效。
// 应用通用文件路径 + path
export function getSandboxFiles(path: string) {
  return `${getContext().filesDir}/${path}`;
}

// 应用在本设备内部存储上用于缓存下载的文件或可重新生成的缓存文件的路径,应用cache目录大小超过配额或者系统空间达到一定条件,自动触发清理该目录下文件;随应用卸载而清理。
// 可以用于保存应用的缓存数据,主要包括离线数据、图片缓存、数据库备份以及临时文件等。此路径下存储的数据可能会被系统自动清理,因此不要存储重要数据。
// 应用缓存文件路径 + path
export function getSandboxCache(path: string) {
  return `${getContext().cacheDir}/${path}`;
}

// 创建文件夹
export function addFileFolder(path: string) {
  fileIo.access(path, (err, res: boolean) => { // 检查文件是否存在
    if (!res) {
      fileIo.mkdirSync(path); // 以同步方法创建目录。
    }
  })
}

// 复制文件
export function copyFileSync(srcPath: string, destPath: string) {
  const srcFile = fileIo.openSync(srcPath, fileIo.OpenMode.READ_ONLY); // 以同步方法打开文件。
  const destFile = fileIo.openSync(destPath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
  fileIo.copyFileSync(srcFile.fd, destFile.fd); // 以同步方法复制文件。
  fileIo.closeSync(srcFile);
  fileIo.closeSync(destFile); // 以同步方法关闭文件。
}

// 图片选择
export async function selectImages(maxNumber: number = 1, where: string = 'files'): Promise<string[]> {
  if (where === 'files') {
    addFileFolder(getSandboxFiles('images')) // 创建images目录
  }
  const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
  photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE。
  photoSelectOptions.maxSelectNumber = maxNumber; // 选择媒体文件的最大数目。
  const photoViewPicker = new photoAccessHelper.PhotoViewPicker();
  return photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
    return photoSelectResult.photoUris.map(filePath => {
      const imageName = filePath.split('/').pop() || '';
      let sandboxPath = ''
      if (where === 'cache') {
        sandboxPath = getSandboxCache(imageName); // 当前上传应用文件功能,仅支持上传应用缓存文件路径(cacheDir)下的文件。
        copyFileSync(filePath, sandboxPath);
        return sandboxPath;
      } else {
        sandboxPath = getSandboxFiles('images/' + imageName);
        copyFileSync(filePath, sandboxPath);
        const bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION;
        let bundleName = bundleManager.getBundleInfoForSelfSync(bundleFlags).name; // 以同步方法根据给定的bundleFlags获取当前应用的BundleInfo。
        return `file://${bundleName}${sandboxPath}`;
      }
    });
  })
}

使用

import { selectImages } from '../../utils/file';

// 相片路径
@State tagImage: string = ''

// 点击拉起相册
.onClick(() => {
  selectImages().then((res: string[]) => {
    if(res.length) {
      this.tagImage = res[0]
    }
  })
})

// 显示
Image(tagImage)
  .width(50)
  .height(50)
  .borderRadius(25);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值