【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,新增設備行為差異説明,在手機設備上,不需要調用該接口,直接初始化朗讀朗讀控件就可以了。