我试图跟踪SpeechRecognizer
的状态,如下所示:
private SpeechRecognizer mInternalSpeechRecognizer;
private boolean mIsRecording;
public void startRecording(Intent intent) {
mIsRecording = true;
// ...
mInternalSpeechRecognizer.startListening(intent);
}
这种方法的问题是保持
mIsRecording
标记为最新是很困难的,例如,如果存在ERROR_NO_MATCH
错误,是否应该将其设置为false
?我的印象是有些设备会停止录音,其他的则不会。
我没有看到像
SpeechRecognizer.isRecording(context)
这样的方法,所以我想知道是否有办法通过运行服务进行查询。 最佳答案
处理结束或错误情况的一种解决方案是将RecognitionListener
设置为SpeechRecognizer
实例。你必须在打电话给startListening()
之前完成!
例子:
mInternalSpeechRecognizer.setRecognitionListener(new RecognitionListener() {
// Other methods implementation
@Override
public void onEndOfSpeech() {
// Handle end of speech recognition
}
@Override
public void onError(int error) {
// Handle end of speech recognition and error
}
// Other methods implementation
});
在您的例子中,您可以使包含
mIsRecording
属性的类实现RecognitionListener
接口。然后,您只需使用以下指令覆盖这两个方法:mIsRecording = false;
此外,您的
mIsRecording = true
指令位于错误的位置。您应该在onReadyForSpeech(Bundle params)
方法定义中执行此操作,否则,当此值为真时,语音识别可能永远不会启动。最后,在管理它的类中,只需创建如下方法:
// Other RecognitionListener's methods implementation
@Override
public void onEndOfSpeech() {
mIsRecording = false;
}
@Override
public void onError(int error) {
mIsRecording = false;
// Print error
}
@Override
void onReadyForSpeech (Bundle params) {
mIsRecording = true;
}
public void startRecording(Intent intent) {
// ...
mInternalSpeechRecognizer.setRecognitionListener(this);
mInternalSpeechRecognizer.startListening(intent);
}
public boolean recordingIsRunning() {
return mIsRecording;
}
注意记录正在运行的调用的线程安全,一切正常:)