鸿蒙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");
  }
}
相关推荐
sun00770015 小时前
android ndk编译valgrind
android
AI视觉网奇16 小时前
android studio 断点无效
android·ide·android studio
jiaxi的天空16 小时前
android studio gradle 访问不了
android·ide·android studio
No Silver Bullet17 小时前
android组包时会把从maven私服获取的包下载到本地吗
android
catchadmin17 小时前
PHP serialize 序列化完全指南
android·开发语言·php
tangweiguo0305198719 小时前
Kable使用指南:Android BLE开发的现代化解决方案
android·kotlin
爱笑的眼睛1121 小时前
HarmonyOS 应用开发深度解析:基于声明式UI的现代化状态管理实践
华为·harmonyos
前端世界21 小时前
HarmonyOS 实战:如何用数据压缩和解压让应用更快更省
华为·harmonyos
00后程序员张21 小时前
iOS App 混淆与资源保护:iOS配置文件加密、ipa文件安全、代码与多媒体资源防护全流程指南
android·安全·ios·小程序·uni-app·cocoa·iphone
哦***721 小时前
华为FreeBuds 7i其他手机能用空间音频吗?如何开启?
华为·音频