我在使用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()
之后立即调用,则在某种程度上,它的行为与“预期”恰好相反:
它为什么表现得像这样,这超出了我的范围,但这至少是LogCat所显示的。
还要注意official documentation的以下附加内容:
换句话说,这种方法是完全没有用的。