如何检查SpeechRecognizer当前是否正在运行?

时间:2017-08-05 16:30:06

标签: android service recognizer-intent

我正试图跟踪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)这样的方法,所以我想知道是否有办法通过运行服务进行查询。

1 个答案:

答案 0 :(得分:-2)

处理结束或错误情况的一种解决方案是将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)方法定义中执行此操作,否则,当此值为true时,语音识别可能永远不会启动。

最后,在管理它的类中,juste创建方法,如:

// 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;
}

注意使用recordingIsRunning调用的线程安全性,一切都会好的:)