不久前,我发现了playEarcon() 不生产 onUtteranceCompleted()。
当时,我刚刚解释了这样的文档:“当一个话语被合成了时调用”onUtteranceCompleted()不适用于耳钉,因为耳镜实际上不是TTS合成的结果。
但是再看看Android的源代码,我根本找不到一个解释来证明我的解释是正确的。
关于我的测试夹具的几个事实
onUtteranceCompleted()总是在耳机之前到达语音ID。这句话是普通的吐温语,不是耳塞。onUtteranceCompleted()的耳塞从来没有出现过。这是非常一致和可复制的行为。深入研究TtsService源代码,似乎只有两个方法可能影响onUtteranceCompleted()的到达(或缺失)。
如果您检查该代码,您将看到第三个候选项TtsService.getSoundResource()被排除在外(因为我的耳环缺少onUtteranceComplete ),因为上面的事实2:耳胶总是在播放,因此getSoundResource()不可能返回null。
使用相同的逻辑,第一位候选人TtsService.processSpeechQueue()也可以被排除在外,因为同样的事实#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;
if (currentSpeechItemCopy != null) {
String callingApp = currentSpeechItemCopy.mCallingApp;
ArrayList<String> params = currentSpeechItemCopy.mParams;
String utteranceId = "";
if (params != null) {
for (int i = 0; i < params.size() - 1; i = i + 2) {
String param = params.get(i);
if (param.equals(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID)) {
utteranceId = params.get(i + 1);
}
}
}
if (utteranceId.length() > 0) {
dispatchUtteranceCompletedCallback(utteranceId, callingApp);
}
}
processSpeechQueue();
}在这里,只有两个条件不能产生dispatchUtteranceCompletedCallback():
但我肯定地知道,条件#2是可以排除的,因为我记录了所有的utteranceIds和耳塞肯定在那里。
此外,检查整个系统日志:
Log.v(SERVICE_TAG, "TTS callback: dispatch started");缺少的onUtteranceCompleted()可能是dispatchUtteranceCompletedCallback()未被调用的结果,但也可能是mCallbacksMap.get(packageName)返回null的结果。
因此,我们又有两种可能性,这两种可能性对我来说都没有多大意义:
mCurrentSpeechItem为null。但是为什么?对于解决这个谜团,有什么建议或其他解释吗?
发布于 2012-09-12 07:29:28
检查android.speech.tts.TextToSpeech#playEarcon()在八零七行。传递给文本到语音服务绑定器的params参数为null,这意味着服务从未接收到您的语音ID。
public int playEarcon(String earcon, int queueMode,
HashMap<String,String> params) {
synchronized (mStartLock) {
...
result = mITts.playEarcon(mPackageName, earcon, queueMode, null);
}
...
}https://stackoverflow.com/questions/11470440
复制相似问题