我试图跟踪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;
}

注意记录正在运行的调用的线程安全,一切正常:)

09-11 20:57