Android 如何在活动类中正确使用TextToSpeech?
我需要安卓工作室的帮助。 我正在尝试开发一个简单的Android活动,它应该说,听,然后回答用户的问题。 首先,我试着让活动简单地发音一个通用短语。 我的问题是,一旦初始化,如果指令是在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
按钮
侦听器之外编写的,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);