前段时间,我发现playEarcon() 永远不会产生 onUtteranceCompleted() 。 当时我只是解释说“当话语被合成时调用”的文档,因为onUtteranceCompleted()不适用于earcons,因为earcon实际上不是TTS合成的结果。 但再次看Android的源代码,我根本无法find一个解释,certificate我的解释。 关于我的testing夹具的一些事实: onUtteranceCompleted()总是到达earcon之前的话语ID。 这个话语是一种普通的TTS话语,而不是一个耳塞。 之后的耳朵确实发挥出来(即完全按照预期)。 onUtteranceCompleted()对于这个earcon 永远不会出现。 这是非常一致和可重复的行为。 深入研究TtsService源代码,似乎只有两种方法可能影响onUtteranceCompleted()的到来(或不存在onUtteranceCompleted() : TtsService.processSpeechQueue() TtsService.onCompletion() 如果你检查这个代码,你会发现第三个候选人TtsService.getSoundResource()被排除了(因为我的earcon缺lessonUtteranceComplete),因为上面的事实#2:earcon总是玩,因此getSoundResource()不可能返回null。 使用相同的逻辑,也可以排除第一候选者TtsService.processSpeechQueue() ,对于同样的事实#2:earcon始终播放,因此总是执行以下2个关键语句: 1108 mPlayer.setOnCompletionListener(this); … 1111 mPlayer.start(); 所以,我们只剩下第二个候选人, TtsService.onCompletion() ,作为一个playEarcon() 永远不会产生 onUtteranceCompleted()的可能解释: public void onCompletion(MediaPlayer arg0) { // mCurrentSpeechItem may become null if it is stopped at the same // time it completes. SpeechItem currentSpeechItemCopy = mCurrentSpeechItem; […]