Android TTS中UtteranceProgressListener的onStart/onDone事件不触发
核心问题定位
Android TextToSpeech的进度回调存在强制校验规则:只有当朗读任务绑定了有效的utteranceId时,系统才会将该任务对应的开始、结束、错误等进度事件,分发给已注册的UtteranceProgressListener。
你现有代码里调用tts.speak()方法时,第三个参数直接传入了null,没有为本次朗读任务绑定utteranceId,因此系统可以正常走完语音播报的全流程、输出语音,但不会为这个无ID的任务触发任何进度回调,这就是你能正常听到朗读、但onStart和onDone始终不执行的根本原因。
具体修复步骤
- 第一步:在
SpeechSynthesizer.java文件头部添加系统类导入:import android.os.Bundle; - 第二步:修改
speakText方法中的朗读调用逻辑,替换原来传null的写法:
原无回调能力的代码:
修改为带有效utteranceId的兼容写法:tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);// 为每次朗读生成全局唯一的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.
相关产品推荐
相关产品推荐

