Android文本到语音-突出显示口语单词

Android文本到语音-突出显示口语单词,android,text-to-speech,Android,Text To Speech,在我的话语进程监听器中,我覆盖了onRangeStart,但它没有被调用 @Override public void onRangeStart(String utteranceId, int start, int end, int frame) { super.onRangeStart(utteranceId, start, end, frame); Spannable wordToSpan = new Spanna

在我的话语进程监听器中,我覆盖了
onRangeStart
,但它没有被调用

       @Override
        public void onRangeStart(String utteranceId, int start, int end, int frame) {
            super.onRangeStart(utteranceId, start, end, frame);

            Spannable wordToSpan = new SpannableString(smartOcrDisplayTextLeft.getText());
            wordToSpan.setSpan(new ForegroundColorSpan(Color.GREEN), start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE);

            smartOcrDisplayTextLeft.setText(wordToSpan);

        }

好的,代码是正确的。在settings->Accessibility to中,您需要选择Google作为文本到语音引擎。

根据UtteranceProgressListener,“可以从多个线程调用此方法中指定的回调。”

要验证这一点,可以添加

boolean wasCalledFromBackgroundThread = (Thread.currentThread().getId() != 1);
                Log.i("XXX", "was onRangeStart() called on a background thread? : " + wasCalledFromBackgroundThread);
到onRangeStart()方法体

根据我的经验,它们在后台线程上被调用的频率更高

因此,像这样围绕UI操作会更安全:

runOnUiThread(new Runnable() {
    @Override
    public void run() {

        Spannable wordToSpan = new SpannableString(smartOcrDisplayTextLeft.getText());
        wordToSpan.setSpan(new ForegroundColorSpan(Color.GREEN), start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
        smartOcrDisplayTextLeft.setText(wordToSpan);

    }
 });

是的,我已经有一段时间没有处理这个了。。。但我验证并编辑了答案。你1的意思是主线程,其他任何东西都是背景?嗯,很有见地。我以前不知道。谢谢