我想知道如何让一个程序暂停并等待一个事件在开始另一个事件之前完成,例如我可以有一个文本到语音说出一些东西,然后谷歌语音识别器应该触发,但是他们俩都同时开火并使语音识别器听到文本到语音。我试着在这里搜索一下它并找到了一些答案,但它们对我来说并不是很清楚,有人可以帮我吗?
这是我测试的示例代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
tts=new TextToSpeech(getApplicationContext(),
new TextToSpeech.OnInitListener() {
@SuppressWarnings("deprecation")
@Override
public void onInit(int status) {
if(status != TextToSpeech.ERROR){
tts.setLanguage(Locale.UK);
tts.speak("Welcome", TextToSpeech.QUEUE_FLUSH, null);
}
}
});
if(!(tts.isSpeaking())){
startVoiceRecognitionActivity();
}
}
private void startVoiceRecognitionActivity()
{
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speak Up");
startActivityForResult(intent, REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK)
{
matches = data.getStringArrayListExtra(
RecognizerIntent.EXTRA_RESULTS);
if (matches.contains("list")){
Intent gotoList = new Intent(MenuActivity.this, ListActivity.class );
startActivity(gotoList);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
答案 0 :(得分:2)
欢迎来到异步事件的精彩世界。
为了做你想做的事,方法不是“等待”(因为一切都会冻结),而是“听”。
当Android中的某些内容需要很长时间,例如文字转语音时,您必须监听活动。
如果你查看Text To Speech对象的文档,你会发现它接受了不同内容的监听器:http://developer.android.com/reference/android/speech/tts/TextToSpeech.html#setOnUtteranceProgressListener(android.speech.tts.UtteranceProgressListener)和http://developer.android.com/reference/android/speech/tts/UtteranceProgressListener.html
所以你要做(假设你的Text to Speech对象是tts
):
tts.setOnUtteranceProgressListener(new UtteranceProgressListener() {
public void onDone(String utteranceId) {
// The text has been read, do your next action
}
public void onError(String utteranceId, int errorCode) {
// Error reading the text with code errorCode, can mean a lot of things
}
public void onStart(String utteranceId) {
// Reading of a sentence has just started. You could for example print it on the screen
}
});
这称为“订阅事件”,并且是异步的,因为您的程序可以执行其他操作,并且当“某事”(您订阅的内容)发生时,您将收到通知。
然后例如当你做
时tts.speak ("welcome", ....)
完成后,将调用侦听器中的方法onDone
。你可以在那里启动语音识别器。