You need to enable JavaScript to run this app. Android TTS中UtteranceProgressListener的onStart/onDone事件不触发
优惠活动
大模型
产品
解决方案
定价
更多

Android TTS中UtteranceProgressListener的onStart/onDone事件不触发

核心问题定位

Android TextToSpeech的进度回调存在强制校验规则:只有当朗读任务绑定了有效的utteranceId时,系统才会将该任务对应的开始、结束、错误等进度事件,分发给已注册的UtteranceProgressListener。
你现有代码里调用tts.speak()方法时,第三个参数直接传入了null,没有为本次朗读任务绑定utteranceId,因此系统可以正常走完语音播报的全流程、输出语音,但不会为这个无ID的任务触发任何进度回调,这就是你能正常听到朗读、但onStart和onDone始终不执行的根本原因。

具体修复步骤
  • 第一步:在SpeechSynthesizer.java文件头部添加系统类导入:
    import android.os.Bundle;
  • 第二步:修改speakText方法中的朗读调用逻辑,替换原来传null的写法:
    原无回调能力的代码:
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
    
    修改为带有效utteranceId的兼容写法:
    // 为每次朗读生成全局唯一的utteranceId,避免任务匹配错乱
    String utteranceId = "tts_task_" + System.currentTimeMillis();
    // 构造承载朗读参数的Bundle对象
    Bundle speakParams = new Bundle();
    speakParams.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, utteranceId);
    // 调用speak时传入参数,兼容多版本Android系统的API要求
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, speakParams, utteranceId);
    
  • 第三步:做基础兼容性排查
    • 确认setOnUtteranceProgressListener的赋值操作,是在TTS初始化成功的回调块内执行,不要在TTS引擎未完成初始化时就提前赋值
    • 检查业务逻辑中是否存在误调用tts.setOnUtteranceProgressListener(null)的情况,避免把已注册的监听器覆盖为null
    • 如果修改后仍有部分机型回调异常,可在初始化完成的逻辑块中添加日志,确认监听器绑定成功,排除时序问题导致的绑定失效

内容的提问来源于stack exchange,提问作者Georg K.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 19:36:04