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");}
}
代碼如下:
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");}
}