鸿蒙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");
  }
}
相关推荐
CYRUS_STUDIO14 分钟前
破解 VMP+OLLVM 混淆:通过 Hook jstring 快速定位加密算法入口
android·算法·逆向
Renounce24 分钟前
【Android】四大组件Service
android
没有了遇见26 分钟前
Activity 启动模式总结
android
wangjialelele43 分钟前
二叉树基本学习
android
移动端开发者1 小时前
鸿蒙Next显示动画animateTo介绍
harmonyos
移动端开发者1 小时前
鸿蒙Next使用AudioCapturer实现音频录制和AI语言转文字
harmonyos
移动端开发者2 小时前
鸿蒙Next选择按钮Toggle、Checkbox、Radio介绍
harmonyos
雨白4 小时前
Android 音视频播放:MediaPlayer 与 VideoView
android
Harry技术4 小时前
Fragment 和 AppCompatActivity 两个核心组件设计的目的和使用场景对比
android·android studio
Renounce4 小时前
【Android】四大组件Activity
android