【问题标题】:UtteranceProgressListener not called未调用 UtteranceProgressListener
【发布时间】:2018-06-23 08:52:57
【问题描述】:

在我的 Android 应用程序中的 TextToSpeech 对象说完一个句子后,我试图采取一些行动,但我的 UtteranceProgressListener.onDone() 方法从未被调用。我尝试了很多东西,包括来自this post 的建议,但没有任何效果。我的应用程序中的相关代码发布在下面。 TextToSpeech 对象正确地说出我给它的句子,但没有调用UtteranceProgressListener 中的任何回调函数。有人可以帮我找出问题所在吗?例如,我提供给TextToSpeech.speak() 函数的话语 ID 是否需要采用我缺少的某种特殊格式?

mtts = new TextToSpeech(myAct, new TextToSpeech.OnInitListener() {
    @Override
    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS) {
            mtts.setLanguage(Locale.US);
        }
    }
});

mtts.setOnUtteranceProgressListener(new UtteranceProgressListener() {
    @Override
    public void onDone(String utteranceId) {
        Toast.makeText(myAct, "OnDone called", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onError(String utteranceId) {
        Toast.makeText(myAct, "OnError called", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onStart(String utteranceId) {
        Toast.makeText(myAct, "OnStart called", Toast.LENGTH_LONG).show();
    }
});

Bundle params = new Bundle();
params.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "");
myAct.mtts.speak(myText, TextToSpeech.QUEUE_FLUSH, params, "MyID");

【问题讨论】:

  • onInit 成功完成后注册 ProgressListener。
  • @brandall 你的意思是把注册放在“if (status == TextToSpeech.SUCCESS)”里面?我试过了,但没有成功。
  • 您是在 onResume 或其他任何地方重新创建 TTS 对象,而不是重新注册 ProgressListener?
  • 不,我只创建一次。
  • 您引用了两个不同的活动 - myAct 和 drawAct。您根本不应该使用活动上下文。如果使用 myAct 上下文初始化 mtts,为什么要通过 drawAct.mtts 访问语音?您的代码以某种方式纠缠于此,无疑是问题的原因。

标签: java android callback text-to-speech onutterancecompleted


【解决方案1】:

看看logcat,你的代码可能已经触发了:android.view.ViewRootImpl$CalledFromWrongThreadException

如果你想做一些 GUI 线程的东西,使用 handler 和 runnable 像这样:

public void onDone(String utteranceId) {
  Log.v(TAG, "Speaking done"); // this is OK
  // This is GUI-thread part
  final View v = findViewById(R.id.txtStatus);
  v.getHandler().post(new Runnable() {
    @Override
    public void run() {
      txtStatus.setText("Speaking done");
    }
  });
}

开始 TTS 说话:

tts.speak("bla bla bla", TextToSpeech.QUEUE_FLUSH, null, "1");

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 2014-09-25
    • 2019-02-27
    • 1970-01-01
    • 2017-08-15
    • 2015-04-15
    • 2014-03-17
    • 2015-02-15
    • 1970-01-01
    相关资源
    最近更新 更多