写点什么

【HarmonyOS 6】SpeechKit 中的朗读控件,初始化前不进行窗口舞台的设置,也不会报错,与文档描述不符。

作者:GeorgeGcs
  • 2025-11-14
    广东
  • 本文字数:1874 字

    阅读完需:约 6 分钟

【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@Componentstruct 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,新增设备行为差异说明,在手机设备上,不需要调用该接口,直接初始化朗读朗读控件就可以了。



发布于: 10 小时前阅读数: 11
用户头像

GeorgeGcs

关注

路漫漫其修远兮,吾将上下而求索。 2024-12-24 加入

鸿蒙创作先锋,华为HDE专家,鸿蒙讲师,作者。 目前任职鸿蒙应用架构师。历经腾讯,宝马,研究所,金融。 待过私企,外企,央企。 深耕大应用开发领域十年。 OpenHarmony,HarmonyOS,Flutter,H5,Android,IOS。

评论

发布
暂无评论
【HarmonyOS 6】SpeechKit中的朗读控件,初始化前不进行窗口舞台的设置,也不会报错,与文档描述不符。_GeorgeGcs_InfoQ写作社区