语音识别器在正常调用时无法正常工作,而不是像 onClick 这样的按钮事件
Speech Recognizer not working when called normally other than button event like onClick
我的程序中有语音识别器,当我 运行 直接在 onCreate 方法语音识别器中的 startListening 方法似乎不起作用。
但是当我将 startListening 方法放在按钮 onClick 方法中时,语音识别器工作。我希望直接调用语音识别器方法 startListening,如下面的程序所示。
以下是我的程序。
SpeechRecognizer mSpeechRecognizer;
Intent mSpeechRecognizerIntent;
TextView textView;
String speakId = "one";
String oldId = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_robo);
textView = (TextView) findViewById(R.id.textView);
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,
Locale.getDefault());
mSpeechRecognizer.setRecognitionListener(new RecognitionListener() {
@Override
public void onReadyForSpeech(Bundle params) {
}
@Override
public void onBeginningOfSpeech() {
}
@Override
public void onRmsChanged(float rmsdB) {
}
@Override
public void onBufferReceived(byte[] buffer) {
}
@Override
public void onEndOfSpeech() {
}
@Override
public void onError(int error) {
}
@Override
public void onResults(Bundle results) {
ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
textView.setText(matches.get(0));
//displaying the first match
//if (matches != null)
//processResult(matches.get(0));
}
@Override
public void onPartialResults(Bundle partialResults) {
}
@Override
public void onEvent(int eventType, Bundle params) {
}
});
/*
below SpeechRecognizer does not start listening when called in MainActivity.
*/
mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
}
}
但是当我在按钮 onClick 事件中调用 mSpeechRecognizer.startListening(mSpeechRecognizerIntent) 时,SpeechRecognizer 正在工作。
public void Listen(View view) {
mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
}
为什么当代码放在 onCreate 方法中而不是放在 onClick 方法中时不起作用。
请告诉解决方案。
我刚刚在 createSpeechRecognizer 之后设置了使用过的 setRecognitionListener,代码运行正常。
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
mSpeechRecognizer.setRecognitionListener(recognitionListener);
mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,
Locale.getDefault());
然后打电话给
mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
它在不使用按钮事件的情况下工作。
RecogniserListener class 应该这样声明。
RecognitionListener recognitionListener = new RecognitionListener() {
@Override
public void onReadyForSpeech(Bundle params) {
}
@Override
public void onBeginningOfSpeech() {
}
@Override
public void onRmsChanged(float rmsdB) {
}
@Override
public void onBufferReceived(byte[] buffer) {
}
@Override
public void onEndOfSpeech() {
}
@Override
public void onError(int error) {
String message;
switch (error) {
case SpeechRecognizer.ERROR_AUDIO:
message = "Audio recording error";
break;
case SpeechRecognizer.ERROR_CLIENT:
message = "Client side error";
break;
case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
message = "Insufficient permissions";
break;
case SpeechRecognizer.ERROR_NETWORK:
message = "Network error";
break;
case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
message = "Network timeout";
break;
case SpeechRecognizer.ERROR_NO_MATCH:
message = "No match";
break;
case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
message = "RecognitionService busy";
break;
case SpeechRecognizer.ERROR_SERVER:
message = "error from server";
break;
case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
message = "No speech input";
break;
default:
message = "Didn't understand, please try again.";
break;
}
textView.setText(message);
}
@Override
public void onResults(Bundle results) {
ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
textView.setText(matches.get(0));
//displaying the first match
//if (matches != null)
//processResult(matches.get(0));
}
@Override
public void onPartialResults(Bundle partialResults) {
}
@Override
public void onEvent(int eventType, Bundle params) {
}
};
我的程序中有语音识别器,当我 运行 直接在 onCreate 方法语音识别器中的 startListening 方法似乎不起作用。 但是当我将 startListening 方法放在按钮 onClick 方法中时,语音识别器工作。我希望直接调用语音识别器方法 startListening,如下面的程序所示。
以下是我的程序。
SpeechRecognizer mSpeechRecognizer;
Intent mSpeechRecognizerIntent;
TextView textView;
String speakId = "one";
String oldId = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_robo);
textView = (TextView) findViewById(R.id.textView);
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,
Locale.getDefault());
mSpeechRecognizer.setRecognitionListener(new RecognitionListener() {
@Override
public void onReadyForSpeech(Bundle params) {
}
@Override
public void onBeginningOfSpeech() {
}
@Override
public void onRmsChanged(float rmsdB) {
}
@Override
public void onBufferReceived(byte[] buffer) {
}
@Override
public void onEndOfSpeech() {
}
@Override
public void onError(int error) {
}
@Override
public void onResults(Bundle results) {
ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
textView.setText(matches.get(0));
//displaying the first match
//if (matches != null)
//processResult(matches.get(0));
}
@Override
public void onPartialResults(Bundle partialResults) {
}
@Override
public void onEvent(int eventType, Bundle params) {
}
});
/*
below SpeechRecognizer does not start listening when called in MainActivity.
*/
mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
}
}
但是当我在按钮 onClick 事件中调用 mSpeechRecognizer.startListening(mSpeechRecognizerIntent) 时,SpeechRecognizer 正在工作。
public void Listen(View view) {
mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
}
为什么当代码放在 onCreate 方法中而不是放在 onClick 方法中时不起作用。 请告诉解决方案。
我刚刚在 createSpeechRecognizer 之后设置了使用过的 setRecognitionListener,代码运行正常。
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
mSpeechRecognizer.setRecognitionListener(recognitionListener);
mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,
Locale.getDefault());
然后打电话给
mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
它在不使用按钮事件的情况下工作。
RecogniserListener class 应该这样声明。
RecognitionListener recognitionListener = new RecognitionListener() {
@Override
public void onReadyForSpeech(Bundle params) {
}
@Override
public void onBeginningOfSpeech() {
}
@Override
public void onRmsChanged(float rmsdB) {
}
@Override
public void onBufferReceived(byte[] buffer) {
}
@Override
public void onEndOfSpeech() {
}
@Override
public void onError(int error) {
String message;
switch (error) {
case SpeechRecognizer.ERROR_AUDIO:
message = "Audio recording error";
break;
case SpeechRecognizer.ERROR_CLIENT:
message = "Client side error";
break;
case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
message = "Insufficient permissions";
break;
case SpeechRecognizer.ERROR_NETWORK:
message = "Network error";
break;
case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
message = "Network timeout";
break;
case SpeechRecognizer.ERROR_NO_MATCH:
message = "No match";
break;
case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
message = "RecognitionService busy";
break;
case SpeechRecognizer.ERROR_SERVER:
message = "error from server";
break;
case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
message = "No speech input";
break;
default:
message = "Didn't understand, please try again.";
break;
}
textView.setText(message);
}
@Override
public void onResults(Bundle results) {
ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
textView.setText(matches.get(0));
//displaying the first match
//if (matches != null)
//processResult(matches.get(0));
}
@Override
public void onPartialResults(Bundle partialResults) {
}
@Override
public void onEvent(int eventType, Bundle params) {
}
};