我在使用isSpeaking()方法时遇到问题。将QUEUE_FLUSH传递给speak()方法时,isSpeaking()可以正常工作。但是,当我将多个语音放入队列中时(通过传递QUEUE_ADD),isSpeaking()方法在已将多个语音放入队列后立即开始返回false

然后我偶然发现了the source code of the TtsService class并看到了以下代码:

public boolean isSpeaking() {
  return (mSelf.mIsSpeaking && (mSpeechQueue.size() < 1));
}

有人知道吗,为什么以这种方式实现此方法?

最佳答案

我也偶然发现了这个。

自您问这个问题以来已经整整一年了,而且还没有答案。

所以我只能猜测,编写这段代码的人的 Intent 是



这有意义吗?

唯一的问题是,无论是在QUEUE_ADD还是QUEUE_FLUSH模式下,经验观察都表明存在严重的计时竞赛条件:

如果在isSpeaking()中被调用,

  • onUtteranceCompleted()将始终返回 false
  • 如果在isSpeaking()之后的第一个 tts.speak()之后的之后立即调用,
  • onUtteranceCompleted()将始终返回 true
  • 如果isSpeaking()在最后tts.speak()和它自己之间至少还有一个tts.speak()s的onUtteranceCompleted()之后立即调用,则
  • ojit_code将始终返回 false

  • 在某种程度上,它的行为与“预期”恰好相反:



    它为什么表现得像这样,这超出了我的范围,但这至少是LogCat所显示的。

    还要注意official documentation的以下附加内容:



    换句话说,这种方法是完全没有用的。

    10-08 02:42