Android - 如何知道TalkBack正在讲话以中断TTS?

4
我在Android上使用TextToSpeech来朗读一系列文本。由于字符串很长,我使用了一个新线程来实现。问题是,如果启用TalkBack语音可访问性,它将停止读取我的应用程序,以便朗读设备的通知,读取用户触摸屏幕时的其他按钮等等。因此,我需要知道何时TalkBack将发声,以便我中断我的线程,等待TalkBack完成宣告后,我的tts将能够继续朗读。实际情况是,我的tts朗读第1行、第2行和第3行(这时TalkBack会说些什么),但我的tts没有阅读第4行、第5行……等等。因为我的重复在线程中持续运行,并且扬声器正被TalkBack占用,所以它只会在TalkBack之后继续朗读到第50、60行。请问是否有任何指导/解决方案?

一个简单的解决方案是为您的应用程序使用不同的语音引擎,这样Talkback就不会干扰它。此外,您可以在发送下一个utterance之前等待每个utterance成功完成(使用utteranceprogresslistener)......或者......您可以不使用线程,发送所有字符串并使用QUEUE.ADD(而不是flush),这样在Talkback中断后,每个字符串都将重新启动。无论如何...我必须猜测,因为您没有包含任何代码。 - Nerdy Bunz
我正在使用QUEUE.ADD进行TTS,但似乎Talkback会清空队列,在Talkback完成后不会重新启动。 - DennisVA
1个回答

1

你可以使用UtteranceProgressListener覆盖onStop方法。当使用Talkback的用户执行任何操作时,您可以通过此方法得到通知。顺便说一下,onStop不是抽象方法,所以您需要自己覆盖它。希望您已经找到了 :)

textToSpeech.setOnUtteranceProgressListener(
        new UtteranceProgressListener() {

    @Override
    public void onStart(String utteranceId) {

    }

    @Override
    public void onDone(String utteranceId) {

    }

    @Override
    public void onStop(String utteranceId, boolean interrupted) {
        super.onStop(utteranceId, interrupted);
        yourCallback.stop();
    }

    @Override
    public void onError(String utteranceId) {

    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接