Android文字转语音-突出语音

时间:2020-01-02 11:32:18

标签: android text-to-speech

在我的UtteranceProgressListener中,我覆盖了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);

        }

1 个答案:

答案 0 :(得分:1)

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

要验证这一点,您可以添加

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);

    }
 });