鸿蒙NEXT开发文件预览工具类(ArkTs)

复制代码
import { uniformTypeDescriptor } from '@kit.ArkData';
import { filePreview } from '@kit.PreviewKit';
import { FileUtil } from './FileUtil';
import { AppUtil } from './AppUtil';
import { WantUtil } from './WantUtil';

/**
 * 文件预览工具类
 * 提供文件预览、加载、判断等功能。
 * author: CSDN-鸿蒙布道师
 * since: 2025/04/16
 */
export class PreviewUtil {
  /**
   * 通过传入文件预览信息,打开预览窗口。1秒内重复调用无效。
   * @param previewInfo 文件的预览信息
   * @returns Promise<void>
   */
  static openPreview(previewInfo: filePreview.PreviewInfo): Promise<void> {
    if (!previewInfo) {
      throw new Error("PreviewInfo cannot be empty.");
    }
    return filePreview.openPreview(AppUtil.getContext(), previewInfo);
  }

  /**
   * 通过传入文件的 URI,打开预览窗口。1秒内重复调用无效。
   * @param uri 文件的 URI
   * @returns Promise<void>
   */
  static async openPreviewEasy(uri: string): Promise<void> {
    if (!uri) {
      throw new Error("URI cannot be empty.");
    }
    const previewInfo = PreviewUtil.generatePreviewInfo(uri);
    return filePreview.openPreview(AppUtil.getContext(), previewInfo);
  }

  /**
   * 根据文件的 URI 判断文件是否可预览。
   * @param uri 文件的 URI
   * @returns Promise<boolean>
   */
  static canPreview(uri: string): Promise<boolean> {
    if (!uri) {
      throw new Error("URI cannot be empty.");
    }
    return filePreview.canPreview(AppUtil.getContext(), uri);
  }

  /**
   * 判断预览窗口是否已经存在。
   * @returns Promise<boolean>
   */
  static hasDisplayed(): Promise<boolean> {
    return filePreview.hasDisplayed(AppUtil.getContext());
  }

  /**
   * 关闭预览窗口,仅当预览窗口存在时起效。
   */
  static closePreview(): void {
    filePreview.closePreview(AppUtil.getContext());
  }

  /**
   * 加载预览文件信息。仅当预览窗口存在时起效。
   * @param previewInfo 文件的预览信息
   * @returns Promise<void>
   */
  static loadData(previewInfo: filePreview.PreviewInfo): Promise<void> {
    if (!previewInfo) {
      throw new Error("PreviewInfo cannot be empty.");
    }
    return filePreview.loadData(AppUtil.getContext(), previewInfo);
  }

  /**
   * 加载预览文件信息。仅当预览窗口存在时起效。
   * @param uri 文件的 URI
   * @returns Promise<void>
   */
  static async loadDataEasy(uri: string): Promise<void> {
    if (!uri) {
      throw new Error("URI cannot be empty.");
    }
    const previewInfo = PreviewUtil.generatePreviewInfo(uri);
    return filePreview.loadData(AppUtil.getContext(), previewInfo);
  }

  /**
   * 调用其他应用预览文件。
   * @param uri 文件的 URI
   * @param write 是否有写入权限,默认为 true
   * @returns Promise<void>
   */
  static onSharePreview(uri: string, write: boolean = true): Promise<void> {
    if (!uri) {
      throw new Error("URI cannot be empty.");
    }
    return WantUtil.openFile(uri, write);
  }

  /**
   * 根据文件 URI 构建 PreviewInfo。
   * @param uri 文件的 URI
   * @returns filePreview.PreviewInfo
   */
  static generatePreviewInfo(uri: string): filePreview.PreviewInfo {
    if (!uri) {
      throw new Error("URI cannot be empty.");
    }
    const fileName = FileUtil.getFileName(uri);
    const fileExtention = FileUtil.getFileExtention(fileName);
    const mimeType = PreviewUtil.getMimeType(fileExtention);

    return {
      title: fileName,
      uri: uri,
      mimeType: mimeType,
    };
  }

  /**
   * 根据文件后缀名获取 TypeDescriptor(标准化数据类型的描述类)。
   * @param fileExtention 文件后缀名,例如:html txt doc ts mp3
   * @returns uniformTypeDescriptor.TypeDescriptor
   */
  static getTypeDescriptor(fileExtention: string): uniformTypeDescriptor.TypeDescriptor {
    if (!fileExtention) {
      throw new Error("File extension cannot be empty.");
    }
    const dataType = uniformTypeDescriptor.getUniformDataTypeByFilenameExtension(`.${fileExtention}`);
    return uniformTypeDescriptor.getTypeDescriptor(dataType);
  }

  /**
   * 根据文件后缀名获取文件 MIME 类型。
   * @param fileExtention 文件后缀名,例如:html txt doc ts mp3
   * @returns string
   */
  static getMimeType(fileExtention: string): string {
    if (!fileExtention) {
      throw new Error("File extension cannot be empty.");
    }
    const typeDescriptor = PreviewUtil.getTypeDescriptor(fileExtention);
    return typeDescriptor.mimeTypes && typeDescriptor.mimeTypes.length > 0 ? typeDescriptor.mimeTypes[0] : '*/*';
  }

  /**
   * 根据文件后缀名获取对应文件类型的图标。
   * @param fileExtention 文件后缀名,例如:html txt doc ts mp3
   * @returns string
   */
  static getIconFileStr(fileExtention: string): string {
    if (!fileExtention) {
      throw new Error("File extension cannot be empty.");
    }
    const descriptor = PreviewUtil.getTypeDescriptor(fileExtention);
    return descriptor.iconFile;
  }

  /**
   * 判断当前设备是否支持文件预览能力。
   * @returns boolean
   */
  static canIUsePreview(): boolean {
    return canIUse("SystemCapability.Filemanagement.FilePreview.Core");
  }
}
代码如下:
TypeScript 复制代码
import { uniformTypeDescriptor } from '@kit.ArkData';
import { filePreview } from '@kit.PreviewKit';
import { FileUtil } from './FileUtil';
import { AppUtil } from './AppUtil';
import { WantUtil } from './WantUtil';

/**
 * 文件预览工具类
 * 提供文件预览、加载、判断等功能。
 * author: CSDN-鸿蒙布道师
 * since: 2025/04/16
 */
export class PreviewUtil {
  /**
   * 通过传入文件预览信息,打开预览窗口。1秒内重复调用无效。
   * @param previewInfo 文件的预览信息
   * @returns Promise<void>
   */
  static openPreview(previewInfo: filePreview.PreviewInfo): Promise<void> {
    if (!previewInfo) {
      throw new Error("PreviewInfo cannot be empty.");
    }
    return filePreview.openPreview(AppUtil.getContext(), previewInfo);
  }

  /**
   * 通过传入文件的 URI,打开预览窗口。1秒内重复调用无效。
   * @param uri 文件的 URI
   * @returns Promise<void>
   */
  static async openPreviewEasy(uri: string): Promise<void> {
    if (!uri) {
      throw new Error("URI cannot be empty.");
    }
    const previewInfo = PreviewUtil.generatePreviewInfo(uri);
    return filePreview.openPreview(AppUtil.getContext(), previewInfo);
  }

  /**
   * 根据文件的 URI 判断文件是否可预览。
   * @param uri 文件的 URI
   * @returns Promise<boolean>
   */
  static canPreview(uri: string): Promise<boolean> {
    if (!uri) {
      throw new Error("URI cannot be empty.");
    }
    return filePreview.canPreview(AppUtil.getContext(), uri);
  }

  /**
   * 判断预览窗口是否已经存在。
   * @returns Promise<boolean>
   */
  static hasDisplayed(): Promise<boolean> {
    return filePreview.hasDisplayed(AppUtil.getContext());
  }

  /**
   * 关闭预览窗口,仅当预览窗口存在时起效。
   */
  static closePreview(): void {
    filePreview.closePreview(AppUtil.getContext());
  }

  /**
   * 加载预览文件信息。仅当预览窗口存在时起效。
   * @param previewInfo 文件的预览信息
   * @returns Promise<void>
   */
  static loadData(previewInfo: filePreview.PreviewInfo): Promise<void> {
    if (!previewInfo) {
      throw new Error("PreviewInfo cannot be empty.");
    }
    return filePreview.loadData(AppUtil.getContext(), previewInfo);
  }

  /**
   * 加载预览文件信息。仅当预览窗口存在时起效。
   * @param uri 文件的 URI
   * @returns Promise<void>
   */
  static async loadDataEasy(uri: string): Promise<void> {
    if (!uri) {
      throw new Error("URI cannot be empty.");
    }
    const previewInfo = PreviewUtil.generatePreviewInfo(uri);
    return filePreview.loadData(AppUtil.getContext(), previewInfo);
  }

  /**
   * 调用其他应用预览文件。
   * @param uri 文件的 URI
   * @param write 是否有写入权限,默认为 true
   * @returns Promise<void>
   */
  static onSharePreview(uri: string, write: boolean = true): Promise<void> {
    if (!uri) {
      throw new Error("URI cannot be empty.");
    }
    return WantUtil.openFile(uri, write);
  }

  /**
   * 根据文件 URI 构建 PreviewInfo。
   * @param uri 文件的 URI
   * @returns filePreview.PreviewInfo
   */
  static generatePreviewInfo(uri: string): filePreview.PreviewInfo {
    if (!uri) {
      throw new Error("URI cannot be empty.");
    }
    const fileName = FileUtil.getFileName(uri);
    const fileExtention = FileUtil.getFileExtention(fileName);
    const mimeType = PreviewUtil.getMimeType(fileExtention);

    return {
      title: fileName,
      uri: uri,
      mimeType: mimeType,
    };
  }

  /**
   * 根据文件后缀名获取 TypeDescriptor(标准化数据类型的描述类)。
   * @param fileExtention 文件后缀名,例如:html txt doc ts mp3
   * @returns uniformTypeDescriptor.TypeDescriptor
   */
  static getTypeDescriptor(fileExtention: string): uniformTypeDescriptor.TypeDescriptor {
    if (!fileExtention) {
      throw new Error("File extension cannot be empty.");
    }
    const dataType = uniformTypeDescriptor.getUniformDataTypeByFilenameExtension(`.${fileExtention}`);
    return uniformTypeDescriptor.getTypeDescriptor(dataType);
  }

  /**
   * 根据文件后缀名获取文件 MIME 类型。
   * @param fileExtention 文件后缀名,例如:html txt doc ts mp3
   * @returns string
   */
  static getMimeType(fileExtention: string): string {
    if (!fileExtention) {
      throw new Error("File extension cannot be empty.");
    }
    const typeDescriptor = PreviewUtil.getTypeDescriptor(fileExtention);
    return typeDescriptor.mimeTypes && typeDescriptor.mimeTypes.length > 0 ? typeDescriptor.mimeTypes[0] : '*/*';
  }

  /**
   * 根据文件后缀名获取对应文件类型的图标。
   * @param fileExtention 文件后缀名,例如:html txt doc ts mp3
   * @returns string
   */
  static getIconFileStr(fileExtention: string): string {
    if (!fileExtention) {
      throw new Error("File extension cannot be empty.");
    }
    const descriptor = PreviewUtil.getTypeDescriptor(fileExtention);
    return descriptor.iconFile;
  }

  /**
   * 判断当前设备是否支持文件预览能力。
   * @returns boolean
   */
  static canIUsePreview(): boolean {
    return canIUse("SystemCapability.Filemanagement.FilePreview.Core");
  }
}
相关推荐
tmacfrank28 分钟前
Android 性能优化入门(一)—— 数据结构优化
android·数据结构·性能优化
东风西巷39 分钟前
Screen Mirroring App:轻松实现手机与电视的无缝投屏
android·智能手机·生活·软件需求
每次的天空1 小时前
Android第三次面试总结之网络篇补充
android·网络·面试
梁下轻语的秋缘1 小时前
鸿蒙系统电脑:开启智能办公新时代
华为·电脑·harmonyos
梁下轻语的秋缘1 小时前
HarmonyOS 与 OpenHarmony:同根而不同途
华为·harmonyos
Unlimitedz8 小时前
iOS音视频解封装分析
ios·音视频
lichao89042710 小时前
谈谈未来iOS越狱或巨魔是否会消失
ios
__Benco10 小时前
OpenHarmony平台驱动开发(十七),UART
人工智能·驱动开发·harmonyos
uwvwko13 小时前
BUUCTF——web刷题第一页题解
android·前端·数据库·php·web·ctf
fzxwl13 小时前
隆重推荐(Android 和 iOS)UI 自动化工具—Maestro
android·ui·ios