Android 如何在活动类中正确使用TextToSpeech?

Android 如何在活动类中正确使用TextToSpeech?,android,android-activity,text-to-speech,Android,Android Activity,Text To Speech,我需要安卓工作室的帮助。 我正在尝试开发一个简单的Android活动,它应该说,听,然后回答用户的问题。 首先,我试着让活动简单地发音一个通用短语。 我的问题是,一旦初始化,如果指令是在按钮侦听器之外编写的,TextToSpeech就不会发出任何声音。 一些代码应该会澄清一些问题: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState

我需要安卓工作室的帮助。 我正在尝试开发一个简单的Android活动,它应该说,听,然后回答用户的问题。 首先,我试着让活动简单地发音一个通用短语。 我的问题是,一旦初始化,如果指令是在
按钮
侦听器之外编写的,TextToSpeech就不会发出任何声音。 一些代码应该会澄清一些问题:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView imgView = findViewById(R.id.emote);
        Button helloBtn = findViewById(R.id.sayBtn);

        EmoteController emoteController = EmoteController.getInstance(MainActivity.this, imgView);
        emoteController.setEmote(Emote.DOUBTFUL);

        tts = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int i) {
                if(i != TextToSpeech.ERROR){
                    tts.setLanguage(Locale.ENGLISH);
                    /*THIS SPEAK DOES WORK WHEN TEXTTOSPEECH VARIABLE IS INITIALIZED!*/
                    tts.speak("Initialized!", TextToSpeech.QUEUE_FLUSH, null, null);
                }
                else{
                    Toast.makeText(getApplicationContext(), "Failed to initialize TextToSpeech", Toast.LENGTH_SHORT).show();
                }
            }
        });

        helloBtn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                /*THIS SPEAK DOES IF WORK IF BUTTON IS CLICKED!*/
                tts.speak("Speech from Button!", TextToSpeech.QUEUE_ADD, null, null);
            }
        });

        /*-->THIS SPEAK DOES NOT WORK!<--*/
        tts.speak("Speech from on create!", TextToSpeech.QUEUE_ADD, null, null);
    }
希望我已经说清楚了, 非常感谢

这里的关键字是“异步”

新TextToSpeech实例的初始化不会在此行之后立即完成,因为它是一个异步进程

tts = new TextToSpeech(..)
每当您看到一个需要xxxListener或xxxCallback作为参数的方法时,它必须是这样的异步方法。这种方法正在做的工作将在将来的其他时候完成,而不是“现在”

这意味着就在这一行之后,tts还不是TextToSpeech的实例,所以这个调用将不起作用

/*-->THIS SPEAK DOES NOT WORK!<--*/
tts.speak("Speech from on create!", TextToSpeech.QUEUE_ADD, null, null);

/*-->此讲话不起作用!谢谢你的回答。所以,为了实现我的目标,我必须做什么?我认为用onInit()调用tts.speak解决了您的问题,对吗?或者我误解了什么?是的,你是对的。这是正确的方法吗?如果我必须使用speak(…),然后听用户的回答,然后再多次使用speak(…),这是一种好的继续方式吗?哦,所以你想让用户和你的应用程序之间进行连续的对话。我认为您应该使用LiveData和ViewModel。无论何时tts初始化完成或用户讲话完成,都可以将ViewModel中的LiveData变量设置为true(例如shouldTtsSpeak.value=true)。然后,在活动或片段中,侦听此变量的更改事件以触发tts.speak()
/*-->THIS SPEAK DOES NOT WORK!<--*/
tts.speak("Speech from on create!", TextToSpeech.QUEUE_ADD, null, null);