首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TtsService中的什么可以解释playEarcon()缺少onUtteranceCompleted()的原因?

TtsService中的什么可以解释playEarcon()缺少onUtteranceCompleted()的原因?
EN

Stack Overflow用户
提问于 2012-07-13 12:23:43
回答 1查看 760关注 0票数 34

不久前,我发现了playEarcon() 不生产 onUtteranceCompleted()

当时,我刚刚解释了这样的文档:“当一个话语被合成了时调用”onUtteranceCompleted()不适用于耳钉,因为耳镜实际上不是TTS合成的结果。

但是再看看Android的源代码,我根本找不到一个解释来证明我的解释是正确的。

关于我的测试夹具的几个事实

  1. onUtteranceCompleted()总是在耳机之前到达语音ID。这句话是普通的吐温语,不是耳塞。
  2. 之后的耳塞会播放(即完全按照预期)。
  3. onUtteranceCompleted()的耳塞从来没有出现过。这是非常一致和可复制的行为。

深入研究TtsService源代码,似乎只有两个方法可能影响onUtteranceCompleted()的到达(或缺失)。

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

如果您检查该代码,您将看到第三个候选项TtsService.getSoundResource()被排除在外(因为我的耳环缺少onUtteranceComplete ),因为上面的事实2:耳胶总是在播放,因此getSoundResource()不可能返回null。

使用相同的逻辑,第一位候选人TtsService.processSpeechQueue()也可以被排除在外,因为同样的事实#2:耳塞总是发挥作用,因此总是执行以下两个关键语句:

代码语言:javascript
复制
1108   mPlayer.setOnCompletionListener(this);
...
1111   mPlayer.start();

因此,我们只剩下第二个候选人,TtsService.onCompletion(),作为为什么playEarcon() 不生产 onUtteranceCompleted()的一个可能的解释。

代码语言:javascript
复制
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()

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

但我肯定地知道,条件#2是可以排除的,因为我记录了所有的utteranceIds和耳塞肯定在那里。

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

代码语言:javascript
复制
Log.v(SERVICE_TAG, "TTS callback: dispatch started");

缺少的onUtteranceCompleted()可能是dispatchUtteranceCompletedCallback()未被调用的结果,但也可能是mCallbacksMap.get(packageName)返回null的结果。

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

  1. 当调用onCompletion()时,earcon的mCurrentSpeechItem为null。但是为什么?
  2. mCallbacksMap是空的。它是什么,它什么时候会有人居住?

对于解决这个谜团,有什么建议或其他解释吗?

EN

回答 1

Stack Overflow用户

发布于 2012-09-12 07:29:28

检查android.speech.tts.TextToSpeech#playEarcon()八零七行。传递给文本到语音服务绑定器的params参数为null,这意味着服务从未接收到您的语音ID。

代码语言:javascript
复制
 public int playEarcon(String earcon, int queueMode,
         HashMap<String,String> params) {
     synchronized (mStartLock) {
         ...
         result = mITts.playEarcon(mPackageName, earcon, queueMode, null);
     }
     ...
 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11470440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档