HarmonyOS 鸿蒙Next getAssets如何区分处理云端图片和本地图片

发布于 1周前 作者 nodeper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next getAssets如何区分处理云端图片和本地图片

背景:功能需要获取用户的所有图片视频并进行一些批处理操作
问题:在打开云照片开关时,photoAccessHelper.getAssets获取到的Asset夹杂有本地Asset和云端Asset,在批处理的时候如果用fs文件管理去处理云端Asset会因为数据不在本地导致一些异常
Q1:如果用mediaAssetManager.requestImageData读取云端Asset,是会先进行网络下载等待?
Q2:有没有办法区分哪些Asset是数据已经在本地,哪些是数据还在云端的?


更多关于HarmonyOS 鸿蒙Next getAssets如何区分处理云端图片和本地图片的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

云端图片到相册,现在是一个自动的机制,手机登录华为账号,会自动拉取云端图片到相册

Q1:mediaAssetManager属于受限开放能力,需要申请受限ohos.permission.READ_IMAGEVIDEO。

咱们是否满足可申请此权限的特殊场景与功能 应用需要克隆、备份或同步图片/视频类文件。

如果不能满足的话,只能使用Picker选择媒体库资源获取图片。

Q2:当前没有办法区分Asset是数据还是云端

主线程中open操作耗时导致,调用fs.open接口会先去下载原图。这段时间在流读文件内容,如果文件较大,不能保证在6s 内读完所有数据。主线程做这个耗时操作必然会 freeze。建议异步线程处理

// 方案1 使用文件异步接口替换同步接口
import fs, { ReadOptions, WriteOptions } from '@ohos.file.fs';
async function readFunc(uri: string, destPath: string): Promise<void> {
  let srcFile: fs.File = await fs.open(uri, fs.OpenMode.READ_ONLY);
  let destFile = fs.openSync(destPath, fs.OpenMode.WRITE_ONLY | fs.OpenMode.CREATE);
  let bufSize = 4096;
  let readSize = 0;
  let buf = new ArrayBuffer(bufSize);
  let readOptions: ReadOptions = { offset: readSize, length: bufSize };
  let readLen = await fs.read(srcFile.fd, buf, readOptions);
  while (readLen > 0) {
    readSize += readLen;
    let writeOptions: WriteOptions = { length: readLen };
    await fs.write(destFile.fd, buf, writeOptions);
    readOptions.offset = readSize;
    readLen = await fs.read(srcFile.fd, buf, readOptions);
  }
  fs.closeSync(srcFile);
  fs.closeSync(destFile);
} 
// 方案2 使用Taskpool执行IO操作
import fs, { ReadOptions, WriteOptions } from '@ohos.file.fs';
function readWriteFile(srcPath: string, destPath: string): void {
  let srcFile = fs.openSync(srcPath, fs.OpenMode.READ_ONLY | fs.OpenMode.CREATE);
  let destFile = fs.openSync(filesDir + '/destFile.txt', fs.OpenMode.WRITE_ONLY |
  fs.OpenMode.CREATE); // 读取源文件内容并写入至目的文件
  let bufSize = 4096;
  let readSize = 0;
  let buf = new ArrayBuffer(bufSize);
  let readOptions: ReadOptions = { offset: readSize, length: bufSize };
  let readLen = fs.readSync(srcFile.fd, buf, readOptions);
  while (readLen > 0) {
    readSize += readLen;
    let writeOptions: WriteOptions = { length: readLen };
    fs.writeSync(destFile.fd, buf, writeOptions);
    readOptions.offset = readSize;
    readLen = fs.readSync(srcFile.fd, buf, readOptions);
  }
  fs.closeSync(srcFile);
  fs.closeSync(destFile);
}

let filePath1: string = “path1”; // 应用文件路径 let filePath2: string = “path2”; taskpool.execute(readWriteFile, [filePath1, filePath2]).then(() => { // 调度结果处理 })

更多关于HarmonyOS 鸿蒙Next getAssets如何区分处理云端图片和本地图片的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,getAssets 方法通常用于访问应用包内的资源文件,而不直接用于处理云端或网络图片。要区分处理云端图片和本地图片,你需要采用不同的方法:

  1. 本地图片

    • 本地图片通常存储在应用的资源目录(如 assetsrawres 文件夹)中。
    • 使用 getAssets() 方法配合 AssetManager 类可以访问这些资源。
    • 例如,通过 AssetFileDescriptorInputStream 读取本地图片文件。
  2. 云端图片

    • 云端图片需要从互联网获取,通常通过 HTTP 或 HTTPS 请求下载。
    • 使用 HttpURLConnection 或第三方网络库(如 OkHttp)进行网络请求。
    • 下载后的图片可以保存在本地缓存中,或直接用于显示(如通过 BitmapFactory 加载)。

在代码中,你可以通过检查图片的来源URL来判断是本地图片还是云端图片。例如,如果URL是以 "file://" 开头,则可能是本地图片;如果是以 "http://""https://" 开头,则通常是云端图片。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部