什么TtsService可以解释playEarcon()缺少onUtteranceCompleted()?

an0*_*00b 34 android text-to-speech onutterancecompleted android-mediaplayer

不久前,我发现playEarcon() 永远不会产生 onUtteranceCompleted().

在我刚才解释认为文件的时间"时的讲话被称为合成为" onUtteranceCompleted()暂时不适用的耳标,因为,一个耳标是不是真的TTS综合后的结果.

但是再看看Android的源代码,我根本找不到能够证明我解释的解释.

关于我的测试夹具的一些事实:

  1. onUtteranceCompleted()总是到达earcon之前的话语ID.那句话是一种普通的TTS话语,而不是一种耳语.
  2. 之后的earcon 确实发挥出来(即完全符合预期).
  3. onUtteranceCompleted()因为那个earcon 永远不会出现.这是非常一致和可重复的行为.

深入研究TtsService源代码,似乎只有2种方法可能会影响到达(或缺席)onUtteranceCompleted():

  1. TtsService.processSpeechQueue()
  2. TtsService.onCompletion()

如果你检查那个代码,你会看到第三个候选者,TtsService.getSoundResource()被排除(由于我的earcon缺乏onUtteranceComplete),因为上面的事实#2:earcon总是在玩,因此getSoundResource()不可能返回null.

使用相同的逻辑,第一个候选者TtsService.processSpeechQueue()也可以排除,对于相同的事实#2:earcon总是在播放,因此总是执行以下2个关键语句:

1108   mPlayer.setOnCompletionListener(this);
...
1111   mPlayer.start();
Run Code Online (Sandbox Code Playgroud)

所以,我们只剩下第二个候选人,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();
}
Run Code Online (Sandbox Code Playgroud)

在那里,只有两个条件无法生成dispatchUtteranceCompletedCallback():

  1. currentSpeechItemCopy == null
  2. utteranceId.length()== 0

但我肯定知道条件#2可以排除,因为我记录所有的话语和耳塞肯定在那里.

另外,检查整个系统日志:

Log.v(SERVICE_TAG, "TTS callback: dispatch started");
Run Code Online (Sandbox Code Playgroud)

缺失onUtteranceCompleted()可能是dispatchUtteranceCompletedCallback()没有被调用的结果,但它也可能是mCallbacksMap.get(packageName)返回null 的结果.

所以,我们又有两种可能性,这两种可能性对我来说都没有多大意义:

  1. 当调用earcon的onCompletion()时,earcon mCurrentSpeechItem为null.但为什么呢?
  2. mCallbacksMap为空.什么是它什么时候填充?

解决这个谜团的任何建议或其他解释?

ala*_*anv 2

检查android.speech.tts.TextToSpeech#playEarcon()在第807行。传递给文本转语音服务绑定器的 params 参数为 null,这意味着该服务永远不会收到您的话语 ID。

 public int playEarcon(String earcon, int queueMode,
         HashMap<String,String> params) {
     synchronized (mStartLock) {
         ...
         result = mITts.playEarcon(mPackageName, earcon, queueMode, null);
     }
     ...
 }
Run Code Online (Sandbox Code Playgroud)