UtteranceProgressListener即使在传递hashmap String后也没有被调用(在标记为重复之前读取)

时间:2017-04-19 15:24:18

标签: java android text-to-speech

我试图在tts上放一个onUtteranceProgressListener。我已经完成了有关stackoverflow的其他相关问题并跟进了它们。但即使在通过Hashmap或Bundle传递话语id字符串后(由于api21之后不推荐使用Hashmap),utteranceProgressListener也不会被调用。我已经用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代码(已弃用发言())是:

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,但结果是一样的。

1 个答案:

答案 0 :(得分:0)

这是因为它可以在另一个线程上工作。 您需要使用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方法之前调用此方法。