admin管理员组

文章数量:1437379

鸿蒙NEXT版仿华为阅读App的浏览MOBI电子书

Reader Kit是HarmonyOS NEXT从5.0.4版本(对应API 16)开始提供的阅读服务,它支持txt、epub、mobi、azw、azw3等多种格式的电子书籍,具备电子书的解析、排版、阅读交互能力,能够帮助开发者快速构建书籍阅读能力。

使用阅读服务之前,要先在ETS代码开头添加以下的导包语句,表示引入阅读服务需要的bookParser、readerCore、ReadPageComponent等模块,及其依赖的BusinessError模块:

代码语言:javascript代码运行次数:0运行复制
import { bookParser, readerCore, ReadPageComponent } from '@kit.ReaderKit';
import { BusinessError } from '@kit.BasicServicesKit';

其中ReadPageComponent为界面布局需要的阅读页组件,用来展示电子书页面内容。ReadPageComponent组件的构造接口可输入以下字段:

controller:ReadPageComponent组件的控制器,取值为readerCore.ReaderComponentController类型。

readerCallback:ReadPageComponent组件的回调函数,其中控制器对象会在第二个回调参数返回(第一个回调参数为BusinessError类型的出错信息)。

注意,ReadPageComponent组件的控制器与其他组件的控制器不一样,其他组件的控制器只需调用构造接口即可使用,但ReadPageComponent组件的控制器仅仅调用构造接口是不够的,还得从readerCallback字段的回调参数中获取最新的控制器对象,然后才能正常调用控制器的相关方法。

控制器类型readerCore.ReaderComponentController主要提供了下列方法:

init:初始化控制器,使用Promise异步回调。

registerBookParser:注册书籍解析器。书籍解析器为bookParser.BookParserHandler类型。

setPageConfig:设置或者修改页面排版属性。排版属性为readerCore.ReaderSetting类型。

startPlay:以指定阅读进度打开书籍,使用Promise异步回调。

flipPage:触发ReadPageComponent组件执行翻页动作。

releaseBook:释放书籍资源,在退出阅读器等释放资源场景时使用。

以上几个方法中,init和registerBookParser是必须调用的,而setPageConfig可调可不调,若不调就按照默认格式排版。registerBookParser方法输入的书籍解析器由bookParser.getDefaultHandler获得,该接口可从指定的文件路径获取默认的书籍解析器。

除此以外,书籍解析器BookParserHandler还提供了下列的常用方法:

getBookInfo:获取书籍信息。

getCatalogList:获取书籍目录列表。

getSpineList:获取书脊内容列表。

getResourceContent:获取书籍内容资源。此接口可获取书封资源比如书籍封面。

由于Reader Kit只能加载应用沙箱内部的电子书文件,因此其他来源的电子书必须先复制到应用沙箱,再让电子书控制器加载沙箱电子书。为此可将电子书籍的浏览功能分解成以下几个步骤:

1、给ETS页面声明一个控制器实例,并在build函数中添加ReadPageComponent组件的布局内容,如下所示:

代码语言:javascript代码运行次数:0运行复制
private readerController = new readerCore.ReaderComponentController();
build() {
  Column() {
    Stack() {
      ReadPageComponent({
        controller: this.readerController,
        readerCallback: (err: BusinessError, data: readerCore.ReaderComponentController) => {
          this.readerController = data;
        }
      })
    }.width('100%').height('100%')
  }.width('100%')
}

2、把其他地方的电子书文件复制到应用内部的沙箱路径,比如下面代码把资源目录下的kite.mobi文档复制到了应用沙箱。

代码语言:javascript代码运行次数:0运行复制
let context = getContext() as common.UIAbilityContext;
// 确保在工程目录src/main/resources/rawfile里存在kite.mobi文档
let filePath = context.filesDir + '/' + this.fileName;
let res = fileIo.accessSync(filePath);
if (!res) {
  let content = context.resourceManager.getRawFileContentSync('rawfile/'+this.fileName);
  let file = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
  fileIo.writeSync(file.fd, content.buffer);
  fileIo.closeSync(file.fd);
}

3、调用电子书控制器的registerBookParser方法,注册指定路径电子书的书籍解析器,注册代码如下所示:

代码语言:javascript代码运行次数:0运行复制
(async () => { // 异步方式加载电子书文档
  let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
  // 组件控制器初始化,用于控制ReadPageComponent调用排版引擎
  this.readerController.init(context);
  // 初始化书籍解析器
  let parserHandler = await bookParser.getDefaultHandler(filePath);
  // 注册解析能力到控制器中,用于排版引擎的调用。
  this.readerController.registerBookParser(parserHandler);
  // 调用打开书籍接口,跳章至对应进度
  this.readerController.startPlay(0, '');
})() // 末尾的一对括号必不可少,不然异步代码块就不会被执行

以上电子书加载代码对应的MOBI文档渲染和翻页效果如下图所示。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-26,如有侵权请联系 cloudcommunity@tencent 删除接口异步appnext华为

本文标签: 鸿蒙NEXT版仿华为阅读App的浏览MOBI电子书