2017-08-05 3 views
4

Ich versuche Zustand SpeechRecognizer zu verfolgen, wie folgt aus:Wie überprüft man, ob SpeechRecognizer gerade läuft?

private SpeechRecognizer mInternalSpeechRecognizer; 
private boolean mIsRecording; 

public void startRecording(Intent intent) { 
mIsRecording = true; 
// ... 
mInternalSpeechRecognizer.startListening(intent); 
} 

Problem mit diesem Ansatz mIsRecording Flagge auf dem neuesten Stand hält ist hart, z.B. wenn es ERROR_NO_MATCH Fehler sollte es false oder nicht eingestellt werden?
ich unter Eindruck bin einige Geräte die Aufnahme stoppen, dann und andere nicht.

Ich sehe kein Verfahren wie SpeechRecognizer.isRecording(context), so frage ich mich, ob es Weg, durch laufende Dienste abzufragen.

Antwort

0

Eine Lösung für die Behandlung von Ende- oder Fehlerfällen ist das Setzen einer RecognitionListener auf Ihre SpeechRecognizer Instanz. Sie müssen es tun vorstartListening() ruft!

Beispiel:

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

In Ihrem Fall können Sie Ihre Klasse machen enthält die mIsRecordingRecognitionListener Schnittstelle implementieren zuzuschreiben. Dann müssen Sie nur noch diese beiden Methoden mit dem folgenden Befehl außer Kraft zu setzen:

mIsRecording = false; 

Außerdem, Ihre mIsRecording = true Anweisung ist an der falschen Stelle. Sie sollten dies in der Methodendefinition onReadyForSpeech(Bundle params) tun, andernfalls wird die Spracherkennung möglicherweise niemals gestartet, solange dieser Wert wahr ist.

schließlich in der Klasse es, juster erstellen Methoden wie die Verwaltung:

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

Seien Sie vorsichtig über die Thread-Sicherheit für recordingIsRunning Anrufe, und alles wird ok :)

+0

, wie ich in einer Frage erwähnt, Wenn 'onError' ausgeführt wird, bedeutet das * nicht *, dass das Gerät die Audioaufnahme gestoppt hat. Wenn es ERROR_NO_MATCH ist, stoppt es manchmal die Aufnahme, manchmal nicht. – Piotr

+0

Und was, wenn Sie 'stopListening()' im Falle von 'ERROR_NO_MATCH' aufrufen? – N0un

+0

Aber ich möchte nicht mit der Aufnahme aufhören, wenn das Gerät fortfahren möchte. – Piotr

Verwandte Themen