【HarmonyOS 6】SpeechKit中的朗读控件,初始化前不进行窗口舞台的设置,也不会报错,与文档描述不符。
【HarmonyOS 6】SpeechKit中的朗读控件,初始化前不进行窗口舞台的设置,也不会报错,与文档描述不符。
一、前言
该文为官方文档bug信息同步帖,结尾有bug官方回复。便于大家信息同步。
前段时间应用升级到HarmonyOS 6,系统提供了很多酷炫的API和功能Kit。对于AI赋能朗读控件,我们在集成后发现了一些问题,由此产生了下面的问题背景。
二、问题背景
如下图所示,官方文档中强调,朗读控件需要在init前,在EntryAbility中进行如下操作:
WindowManager.setWindowStage(windowStage);

但实际上,不进行该操作,直接调用init初始化朗读控件,不会报错,可将以下DEMO源码,可直接新建工程后,贴到index.ets类中,启自动签名后,启动查看效果。
// 导入语音朗读相关的组件和类型
import { TextReader, TextReaderIcon, ReadStateCode } from '@kit.SpeechKit';@Entry
@Component
struct Index {/*** 待加载的文章列表*/@State readInfoList: TextReader.ReadInfo[] = [];/*** 当前选中的文章*/@State selectedReadInfo: TextReader.ReadInfo = this.readInfoList[0];/*** 朗读状态*/@State readState: ReadStateCode = ReadStateCode.WAITING;/*** 初始化状态标记*/@State isInit: boolean = false;// 组件即将显示时触发async aboutToAppear(){/*** 模拟加载文章数据*/let readInfoList: TextReader.ReadInfo[] = [{id: '001',title: {text:'水调歌头.明月几时有',isClickable:true},author:{text:'宋.苏轼',isClickable:true},date: {text:'2024/01/01',isClickable:false},bodyInfo: '明月几时有?把酒问青天。不知天上宫阙,今夕是何年?'}];// 更新状态变量this.readInfoList = readInfoList;this.selectedReadInfo = this.readInfoList[0];// 初始化朗读组件this.init();}/*** 初始化朗读组件*/async init() {// 朗读参数配置const readerParam: TextReader.ReaderParam = {isVoiceBrandVisible: true, // 显示品牌信息businessBrandInfo: {panelName: '小艺朗读', // 面板名称panelIcon: $r('app.media.startIcon') // 面板图标}}try {// 获取上下文let context: Context | undefined = this.getUIContext().getHostContext()if (context) {// 初始化朗读组件await TextReader.init(context, readerParam);this.isInit = true; // 标记初始化完成this.setActionListener(); // 设置事件监听}} catch (err) {// 初始化失败时打印错误信息console.error(`TextReader failed to init. Code: ${err.code}, message: ${err.message}`);}}// 设置朗读事件监听setActionListener() {// 监听朗读状态变化TextReader.on('stateChange', (state: TextReader.ReadState) => {this.onStateChanged(state);});// 监听加载更多请求TextReader.on('requestMore', () => {TextReader.loadMore([], true);})}// 处理朗读状态变化onStateChanged = (state: TextReader.ReadState) => {// 只处理当前选中文章的状态变化if (this.selectedReadInfo?.id === state.id) {this.readState = state.state;} else {this.readState = ReadStateCode.WAITING;}}// 构建UI界面build() {Column() {// 朗读状态图标TextReaderIcon({ readState: this.readState }).margin({ right: 20 }).width(32).height(32).onClick(async () => {// 点击图标时开始朗读try {await TextReader.start(this.readInfoList, this.selectedReadInfo?.id);} catch (err) {// 朗读失败时打印错误信息console.error(`TextReader failed to start. Code: ${err.code}, message: ${err.message}`);}})}.height('100%')}
}

三、问题反馈:
目前官方文档已更新,setWindowStage,新增设备行为差异说明,在手机设备上,不需要调用该接口,直接初始化朗读朗读控件就可以了。

