一、Preview Kit

1.1 核心能力

能力 说明
文件预览 快速启动预览界面,对图片、视频、音频、文本、html等文件进行内容查看
文件打开加速 预加载机制提前加载文件,缩短打开时间(仅2in1设备)
通用文件缓存加速 缓存解码数据到磁盘,再次打开时无需重复解码

1.2 文件预览特点

  • 支持选中多文件,在预览列表切换显示

  • 支持文件分享

  • 支持“使用其他应用打开”跳转到具体应用

  • 图片支持旋转、放大等操作(非2in1设备)

注意:Office文档预览借助WPS能力实现,预览界面会有WPS提供的技术支持。

二、限制

限制项 说明
支持地区 仅中国境内(港澳台除外)
支持设备(文件预览) Phone、Tablet、2in1
支持设备(文件打开加速) 仅2in1设备
模拟器预览 不支持.pdf/.pptx/.xlsx/.docx等文档类文件格式预览
模拟器加速功能 不支持文件打开加速和通用文件缓存加速
预览方式 仅支持跳出应用进行预览,暂不支持应用内预览

三、支持的文件类型

类型 文件后缀 mimeType
文本 txt、cpp、c、h、java、xhtml、xml text/plain等
网页 html、htm text/html
图片 jpg、png、gif、webp、bmp、svg image/jpeg等
音频 m4a、aac、mp3、ogg、wav audio/mp4a-latm等
视频 mp4、mkv、ts video/mp4等
PDF pdf application/pdf
Office文档 doc、docx、xls、xlsx、ppt、pptx、csv、ofd application/msword等

注意:实际支持情况可采用canPreview接口判断。

四、核心接口

接口 描述
openPreview(context, file, info) 打开预览功能(单个文件)
openPreview(context, files, index) 打开预览功能(多个文件,仅移动端)
canPreview(context, uri) 判断文件是否可预览
hasDisplayed(context) 判断预览窗口是否已经存在
closePreview(context) 关闭预览窗口
loadData(context, file) 加载预览文件信息(仅当预览窗口存在时生效)

五、开发步骤

5.1 导入模块

import { filePreview } from '@kit.PreviewKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';

5.2 判断是否可以预览

let uri = 'file://docs/storage/Users/currentUser/Documents/1.txt';
let uiContext = this.getUIContext().getHostContext() as common.Context;

filePreview.canPreview(uiContext, uri).then((result) => {
  console.info(`Succeeded in obtaining the result of whether it can be previewed. result = ${result}`);
}).catch((err: BusinessError) => {
  console.error(`Failed to obtain the result, err.code = ${err.code}, err.message = ${err.message}`);
});

5.3 打开文件预览(单文件)

Promise方式

let uiContext = this.getUIContext().getHostContext() as common.Context;

let displayInfo: filePreview.DisplayInfo = {
  x: 100,
  y: 100,
  width: 800,
  height: 800
};

let fileInfo: filePreview.PreviewInfo = {
  title: '1.txt',
  uri: 'file://docs/storage/Users/currentUser/Documents/1.txt',
  mimeType: 'text/plain'
};

filePreview.openPreview(uiContext, fileInfo, displayInfo).then(() => {
  console.info('Succeeded in opening preview');
}).catch((err: BusinessError) => {
  console.error(`Failed to open preview, err.code = ${err.code}, err.message = ${err.message}`);
});

Callback方式

filePreview.openPreview(uiContext, fileInfo, displayInfo, (err) => {
  if (err && err.code) {
    console.error(`Failed to open preview, err.code = ${err.code}, err.message = ${err.message}`);
    return;
  }
  console.info('Succeeded in opening preview');
});

5.4 打开文件预览(多文件,仅移动端)

let uiContext = this.getUIContext().getHostContext() as common.Context;

let fileInfo1: filePreview.PreviewInfo = {
  title: '1.txt',
  uri: 'file://docs/storage/Users/currentUser/Documents/1.txt',
  mimeType: 'text/plain'
};
let fileInfo2: filePreview.PreviewInfo = {
  title: '2.txt',
  uri: 'file://docs/storage/Users/currentUser/Documents/2.txt',
  mimeType: 'text/plain'
};

let files: Array<filePreview.PreviewInfo> = [fileInfo1, fileInfo2];

filePreview.openPreview(uiContext, files, 0).then(() => {
  console.info('Succeeded in opening preview');
}).catch((err: BusinessError) => {
  console.error(`Failed to open preview, err.code = ${err.code}, err.message = ${err.message}`);
});

5.5 加载新文件(预览窗口已存在时)

let uiContext = this.getUIContext().getHostContext() as common.Context;

let fileInfo: filePreview.PreviewInfo = {
  title: '2.txt',
  uri: 'file://docs/storage/Users/currentUser/Documents/2.txt',
  mimeType: 'text/plain'
};

filePreview.loadData(uiContext, fileInfo).then(() => {
  console.info('Succeeded in loading data.');
}).catch((err: BusinessError) => {
  console.error(`Failed to load data, err.code = ${err.code}, err.message = ${err.message}`);
});

5.6 关闭预览窗口

let uiContext = this.getUIContext().getHostContext() as common.Context;

filePreview.closePreview(uiContext).then(() => {
  console.info('Succeeded in closing preview');
}).catch((err: BusinessError) => {
  console.error(`Failed to close preview, err.code = ${err.code}, err.message = ${err.message}`);
});

六、注意事项

注意点 说明
预览方式 仅支持跳出应用预览,不支持应用内预览
Office预览 借助WPS能力,界面会显示WPS相关字样
重复调用 openPreview在1秒内重复调用无效
loadData限制 100毫秒内重复调用无效
多文件预览 仅移动端可用
权限 需要调用方存在对应uri的转授权能力
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐