playEarcon()
しばらく前に、 が を生成しないこと を発見しましたonUtteranceCompleted()
。
当時、 「発話が合成されたときに呼び出される」というドキュメントをonUtteranceCompleted()
、イヤーコンには適用できないと解釈しました。なぜなら、イヤーコンは実際には TTS 合成の結果ではないからです。
しかし、Android のソース コードをもう一度見てみると、私の解釈を正当化する説明が見つかりません。
私のテスト治具に関するいくつかの事実:
onUtteranceCompleted()
earcon の前の発話 ID には常に到着します。その発話は通常の TTS 発話であり、イヤコンではありません。- その後のearconは実行されます(つまり、意図したとおりです)。
onUtteranceCompleted()
そのearconは決して現れません。これは非常に一貫した再現可能な動作です。
TtsService のソース コードを深く掘り下げると、の到着 (または不在) に影響を与えるメソッドは 2 つしかないようですonUtteranceCompleted()
。
そのコードを調べると、3 番目の候補であるTtsService.getSoundResource()が除外されていることがわかります (私の earcon の onUtteranceComplete の欠如の原因として) getSoundResource()
。 null を返します。
同じロジックを使用して、最初の候補であるTtsService.processSpeechQueue()も除外できます。同じ事実 #2: イヤーコンは常に再生されるため、次の 2 つの重要なステートメントが常に実行されます。
1108 mPlayer.setOnCompletionListener(this);
...
1111 mPlayer.start();
したがって、2 番目の候補であるTtsService.onCompletion()のみが、 aplayEarcon()
が生成 されない理由の可能な説明として残されてい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 つだけあります。
- currentSpeechItemCopy == null
- 発話Id.長さ() == 0
しかし、私はすべての utteranceIds をログに記録し、earcon が確実にそこにあるため、条件 2 を除外できることは確かです。
また、システム ログ全体を調べます。
Log.v(SERVICE_TAG, "TTS callback: dispatch started");
欠落onUtteranceCompleted()
は、dispatchUtteranceCompletedCallback()が呼び出されなかった結果である可能性がありますが、mCallbacksMap.get(packageName)
null が返された結果である可能性もあります。
したがって、再び 2 つの可能性が残されていますが、どちらもあまり意味がありません。
- earcon のonCompletion()が呼び出されるまでに、earcon
mCurrentSpeechItem
は null です。しかし、なぜですか? - mCallbacksMapは空です。それは何で、いつ人口が増えるのですか?
このミステリーを解決するための提案やその他の説明はありますか?