【问题标题】:UtteranceProgressListener not being Called even after passing hashmap String(read before flagging as duplicate)即使在传递哈希映射字符串之后也没有调用 UtteranceProgressListener(在标记为重复之前读取)
【发布时间】:2018-07-11 15:15:52
【问题描述】:

我正在尝试在 tts 上放置一个 onUtteranceProgressListener。我已经阅读了有关 stackoverflow 的其他相关问题并关注了它们。但即使在通过 Hashmap 或 Bundle 传递话语 id 字符串(因为 Hashmap 在 api21 之后不推荐使用)之后,也不会调用 utteranceProgressListener。我用 toasts 来验证,但没有 toast 输出。我正在获取音频输出,但无法让 progressListener 对其进行处理。

@Override
    public void onInit(int initStatus) {
        if (initStatus == TextToSpeech.SUCCESS) {
            myTTS.setOnUtteranceProgressListener(new UtteranceProgressListener() {
                @Override
                public void onStart(String utteranceId) {
                    Toast.makeText(InvisibleActivity.this,"listener Started",Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onDone(String utteranceId) {
                    if (utteranceId.equals("utteranceId")) {
                        myTTS.stop();
                        Toast.makeText(InvisibleActivity.this,"mytts stopped",Toast.LENGTH_SHORT).show();

                    }
                }

                @Override
                public void onError(String utteranceId) {

                }
            });
            myTTS.setLanguage(Locale.US);
        } else if (initStatus == TextToSpeech.ERROR) {
            Toast.makeText(this, "Sorry,Text To speech not supported", Toast.LENGTH_SHORT).show();
        }
        Bundle bundle = new Bundle();
        bundle.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,"utteranceId");

        myTTS.speak(outText, TextToSpeech.QUEUE_FLUSH, bundle,null);
        chan();
    }

我使用的 Hashmap 代码(带有不推荐使用的 speak())是:

HashMap<String,String> params = new HashMap<>();
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,"utteranceId");
myTTS.speak(outText,TextToSpeech.QUEUE_FLUSH, params);

QUEUE_ADDQUEUE_FLUSH 我都试过了,但结果是一样的。

【问题讨论】:

    标签: java android text-to-speech


    【解决方案1】:

    这是因为它在另一个线程上工作。 您需要使用 runOnUiThread 使其工作:

    tts.setOnUtteranceProgressListener(new UtteranceProgressListener() {
                @Override
                public void onStart(String s) {
    
                    final String keyword = s;
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(), "Started " + keyword, Toast.LENGTH_SHORT).show();
                        }
                    });
    
    
                }
    
                @Override
                public void onDone(String s) {
    
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(), "Done ", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
    
                @Override
                public void onError(String s) {
    
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(), "Error ", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            });
    

    确保在speak 方法之前调用此方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-30
      • 2011-07-30
      • 1970-01-01
      • 2018-04-25
      • 2018-03-31
      • 2022-01-16
      • 2020-04-15
      相关资源
      最近更新 更多