HarmonyOS鸿蒙Next中想展示沙箱环境下的文件列表,文件列表中想用文件的缩略图当图标,怎么实现呢

HarmonyOS鸿蒙Next中想展示沙箱环境下的文件列表,文件列表中想用文件的缩略图当图标,怎么实现呢 想展示沙箱环境下的文件列表,文件列表中想用文件的缩略图当图标。

Preview Kit试了似乎实现不了。这边有什么好的方法吗?

5 回复

缩略图生成方案 需通过photoAccessHelper获取图片文件的缩略图资源,结合image组件实现展示。Preview Kit主要用于文件内容预览而非缩略图生成,因此需要独立处理缩略图逻辑

实现步骤参考:

// 在PhotoFile类中定义获取缩略图方法 import { dataSharePredicates } from ‘@kit.ArkData’;

async function example(phAccessHelper: photoAccessHelper.PhotoAccessHelper) { console.info(‘getThumbnailDemo’); let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); let fetchOption: photoAccessHelper.FetchOptions = { fetchColumns: [], predicates: predicates }; let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOption); let asset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject(); console.info('asset displayName = ', asset.displayName); asset.getThumbnail((err, pixelMap) => { if (err === undefined) { console.info('getThumbnail successful ’ + pixelMap); } else { console.error(getThumbnail fail with error: ${err.code}, ${err.message}); } }); }

参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-photoaccesshelper-photoasset#getthumbnail

更多关于HarmonyOS鸿蒙Next中想展示沙箱环境下的文件列表,文件列表中想用文件的缩略图当图标,怎么实现呢的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


【背景知识】

[@ohos.file.AlbumPickerComponent (Album Picker组件)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ohos-file-albumpickercomponent):

应用可以在布局中嵌入AlbumPickerComponent组件,通过此组件,应用无需申请权限,即可访问公共目录中的相册列表。

需配合PhotoPickerComponent一起使用,用户通过AlbumPickerComponent组件选择对应相册并通知PhotoPickerComponent组件刷新成对应相册的图片和视频。

【参考方案】

可参考选择相片页面自定义示例,通过使用[@ohos.file.PhotoPickerComponent](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ohos-file-photopickercomponent)访问图库,使用[@ohos.file.AlbumPickerComponent](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ohos-file-albumpickercomponent)访问相册列表。

  1. PhotoPickerComponent组件获取图库图片并展示,通过PickerOptions修改样式。
  2. AlbumPickerComponent组件获取相册列表,点击不同相册更新PhotoPickerComponent组件内容。
  3. 已选择图片或视频通过下方可滑动列表展示。
PhotoPickerComponent({
  // 定义相册样式
  pickerOptions: this.pickerOptions,
  // 点击勾选创建SelectPhotoInfo对象存储图片地址或视频缩略图
  onItemClicked: (itemInfo: ItemInfo, clickType: ClickType): boolean => this.onItemClicked(itemInfo,
    clickType),
  ......  
})
AlbumPickerComponent({
  albumPickerOptions: this.albumPickerOptions,
  // 点击相册名称后更新PhotoPickerComponent组件显示内容
  onAlbumClick: (albumInfo: AlbumInfo): boolean => this.onAlbumClick(albumInfo),
})
List({ space: 2, initialIndex: 0, scroller: this.scrollerForList }) {
  // 列表展示已选择图片或视频缩略图
  ForEach(this.selectSelectPhotoInfos, (item: SelectPhotoInfo, index: number) => {
    ListItem() {
      Image(item.type === Constants.TYPE_IMAGE ? item.uri : item.thumbnail)
    }
  })
}

1/ 使用@kit.CoreFileKit遍历应用沙箱目录:

import { fileio } from '[@kit](/user/kit).CoreFileKit';

// 获取沙箱路径(这里就以cache目录为例)

const context = getContext(this) as common.UIAbilityContext;

const sandboxPath = context.filesDir;

// 读取目录中的文件列表

let dir = fileio.opendirSync(sandboxPath);

let fileList: Array<{ name: string, path: string }> = [];

let entry = dir.readSync();

while (entry !== undefined) {

  if (entry.isFile()) {

    fileList.push({

      name: entry.name,

      path: sandboxPath + '/' + entry.name

    });

  }

  entry = dir.readSync();

}

dir.closeSync();

2/ 生成缩略图

import { photoAccessHelper } from '[@kit](/user/kit).MediaLibraryKit';

// 通过文件路径获取缩略图

async function getThumbnail(filePath: string): Promise<image.PixelMap> {

  const assets = await photoAccessHelper.getAssets({

    selection: {

      uri: `file://${filePath}`,

      type: photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE

    }

  });

  return await assets.getThumbnail({

    size: { width: 64, height: 64 }

  });

}

非图片文件处理:

// 根据扩展名匹配图标

function getFileIcon(fileName: string): Resource {

  const ext = fileName.split('.').pop()?.toLowerCase();

  switch (ext) {

    case 'doc': return $r('app.media.word_icon');

    case 'pdf': return $r('app.media.pdf_icon');

    default: return $r('app.media.unknown_icon');

  }

}

3/ 列表渲染实现

// 使用LazyForEach优化性能

List({ space: 10 }) {

  LazyForEach(this.fileList, (item) => {

    ListItem() {

      Row() {

        if (item.type === 'image') {

          Image(await getThumbnail(item.path))

            .size({ width: 64, height: 64 })

        } else {

          Image(getFileIcon(item.name))

            .size({ width: 64, height: 64 })

        }

        Text(item.name)

          .fontSize(16)

      }

    }

  }, item => item.path)

}

在HarmonyOS Next中,通过@ohos.file.fs@ohos.file.photoAccessHelper接口访问沙箱文件。使用photoAccessHelper.getThumbnail获取文件缩略图,绑定到Image组件显示。需申请ohos.permission.READ_IMAGEVIDEO权限。具体实现涉及调用PAH接口查询文件并提取缩略图数据。

在HarmonyOS Next中,可以通过FileManagerImage组件结合实现沙箱环境下文件列表的缩略图展示。具体步骤如下:

  1. 使用@ohos.file.fs获取沙箱目录文件列表,通过listFile遍历文件。
  2. 针对图片文件(如jpg/png),用Image组件加载沙箱路径(如internal://app/files/xxx.jpg)直接显示缩略图。
  3. 非图片文件可调用file.getThumbnail(部分格式支持)或使用默认图标替代。
  4. 注意缩略图生成需在主线程处理,避免阻塞UI,可考虑异步加载或缓存机制优化性能。

若Preview Kit不适用,上述方法可灵活定制缩略图逻辑。

回到顶部