鸿蒙学习实战之路-Reader Kit获取书籍信息最佳实践

最近好多朋友问我:“西兰花啊,我想在鸿蒙应用里做个书架功能,怎么才能读取电子书的书名、作者和封面啊?” 害,这问题可问对人了!咱们做阅读器,第一步就是得把书的基本信息搞到手,就像做饭前得先看清楚食材一样~

今天这篇,我就手把手带你用Reader Kit获取书籍信息,教你怎么从电子书中提取书名、作者和封面,全程不超过10分钟(不含下载时间)~


一、获取书籍信息的基本流程

咱们先来看个流程图,了解一下整个过程是咋回事:

在这里插入图片描述

简单来说,整个流程就像咱们去超市买菜:

  1. 先把书导入到应用沙箱目录(就像把菜放进购物车)
  2. 初始化书籍解析器(就像准备好切菜板和刀)
  3. 获取书籍信息(就像查看菜的品种和新鲜度)
  4. 展示到书架上(就像把菜摆到冰箱里)

二、需要用到的接口

咱们做这个功能,主要需要用到3个接口,就像做饭需要用到锅碗瓢盆一样:

接口名 描述
getDefaultHandler 获取书籍默认解析器,相当于找个专业的厨师来帮咱们处理食材
getBookInfo 获取书籍信息,相当于让厨师告诉你这道菜的具体信息
getResourceContent 获取书籍内容资源,相当于让厨师帮咱们准备好需要的材料

三、具体实现步骤

1. 导入相关模块

首先,咱们得把需要的模块导入进来,就像做饭前先把所有工具都摆出来一样:

import { common } from "@kit.AbilityKit";
import { bookParser } from "@kit.ReaderKit";
import { hilog } from "@kit.PerformanceAnalysisKit";
import { image } from "@kit.ImageKit";

2. 初始化书籍解析器

接下来,咱们需要初始化书籍解析器,就像做饭前先把食材洗干净一样:

private defaultHandler: bookParser.BookParserHandler | null = null;
aboutToAppear(): void {
    this.init().then(() => {
    });
}
private async init() {
    let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
    let path: string = `${context.filesDir}/abc.epub`; // 这里的路径是书籍在沙箱中的位置
    try {
        this.defaultHandler = await bookParser.getDefaultHandler(path);
    } catch (error) {
        hilog.error(0x0000, "testTAG", `getDefaultHandler failed, Code: ${error.code}, message: ${error.message}`);
    }
}

3. 获取并展示书籍信息

现在,咱们就可以获取书籍的书名、作者和封面了,就像厨师把做好的菜端上桌一样:

@State bookCover: PixelMap | null = null;
@State bookTitle: string = '';
@State author: string = '';
aboutToAppear(): void {
    this.init().then(() => {
        this.getBookInfo();
    });
}
private async getBookInfo() {
    try {
        let bookInfo: bookParser.BookInfo | undefined = this.defaultHandler?.getBookInfo();
        if (bookInfo) {
            // 获取书名
            this.bookTitle = bookInfo.bookTitle || '';
            // 获取作者
            this.author = bookInfo?.bookCreator || '';
            // 获取封面图片
            // 注意:获取封面时spineIndex传-1就行
            let buffer = this.defaultHandler?.getResourceContent(-1, bookInfo.bookCoverImage);
            let imageSource: image.ImageSource = image.createImageSource(buffer);
            this.bookCover = await imageSource.createPixelMap();
            // 记得释放资源,就像做完饭要洗碗一样
            imageSource.release();
        }
        hilog.info(0x0000, 'testTAG', 'getBookInfo bookInfo is: ' + JSON.stringify(bookInfo));
    } catch (error) {
        hilog.error(0x0000, 'testTAG', `getBookInfo failed, Code: ${error.code}, message: ${error.message}`);
    }
}
build() {
    Column() {
        Text('书名:' + this.bookTitle)
            .fontSize(20)
            .fontColor("#E6000000")
            .margin({ top: 50 })
        Text('作者:' + this.author)
            .fontSize(20)
            .fontColor("#E6000000")
            .margin({ top: 10 })
        Image(this.bookCover)
            .width(200)
            .aspectRatio(3 / 4)
            .borderRadius(5)
            .margin({ top: 10 })
    }
    .alignItems(HorizontalAlign.Start)
    .margin({ left: 10, right: 10 })
}

四、需要注意的地方

🥦 西兰花警告

  1. 书籍文件必须在沙箱目录:Reader Kit只能读取应用沙箱目录下的书籍文件,就像厨师只能用厨房里的食材一样,外面的食材进不来~

  2. 要处理异常情况:不同格式的电子书可能会有不同的问题,比如有些epub文件可能没有封面,咱们得做好异常捕获,就像做饭时要准备好应对突发情况一样~

  3. 记得释放资源:获取完封面图片后,一定要调用imageSource.release()释放资源,就像做完饭要洗碗一样,不然会内存泄漏哦~

🥦 西兰花小贴士

  • 获取封面的小技巧:获取封面时,spineIndex参数传-1就行,因为封面不属于正文内容,不需要指定具体的章节索引~

  • 支持的格式:Reader Kit支持txt、epub、mobi、azw、azw3格式的电子书,就像一个万能的食材处理器,不管是什么食材都能处理~


五、下一步行动

现在咱们已经学会了如何获取书籍信息,接下来可以试试:

  1. 实现书架功能,展示多本书的信息
  2. 添加书籍导入功能,让用户可以从本地选择书籍
  3. 实现目录功能,让用户可以快速跳转到指定章节

📚 推荐资料


我是盐焗西兰花,
不教理论,只给你能跑的代码和避坑指南。
下期见!🥦

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐