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