当前位置: 首页 > news >正文

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

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);
http://www.dtcms.com/a/111250.html

相关文章:

  • 第11/100节:三点估算
  • Muduo网络库实现 [十五] - HttpContext模块
  • 传统开发者视角:智能合约与区块链数据库探秘
  • 实操(进程状态,R/S/D/T/t/X/Z)Linux
  • im即时通讯支持红包收发分销功能,带内嵌web页面,已经测试完美运行
  • 二级索引详解
  • 从基础算力协作到超智融合,超算互联网助力大语言模型研习
  • C++学习笔记之 模板|函数模板|类模板
  • 嵌入式学习笔记——ARM-中断与异常
  • R5周:天气预测
  • linux 进程/线程设置核亲和性
  • MySQL统计信息
  • JS dom修改元素的style样式属性
  • 删除Linux服务器上多余的系统启动项,并重装Ubuntu系统
  • Java 连接 WebSocket 入门教程
  • 【Web 服务器】的工作原理
  • 第十八节课:Python编程基础复习
  • wx206基于ssm+vue+uniapp的优购电商小程序
  • NLP高频面试题(三十五)——LLaMA / ChatGLM / BLOOM的区别
  • AI + 慢病逆转 1
  • USB传输(Transaction)过程简介
  • swift-oc和swift block和代理
  • ElasticSearch JavaRestClient查询之高亮显示
  • JS用ES6和ES5分别实现:8字节长整数和字节数组的互转
  • 软考系统架构师 — 4 嵌入式软件
  • H.266/VVC SCC技术学习:块差分脉冲编码调整(block differential pulse coded modulation, BDPCM)
  • 生信入门:专栏概要与内容目录
  • AI算法大全初见面
  • Redisson使用详解
  • 《Maven高级应用:继承聚合设计与私服Nexus实战指南》