2013-03-16 4 views
6

ja Udoskonalanie aplikacji Android, który wykorzystuje klasę RecognitionListener słuchać głosu użytkownika, tutaj ja dostać poniżej wyników:Jak zrestartować słuchania ponownie po RecognitionListener wziąć błąd ERROR_RECOGNIZER_BUSY

1-) Jeśli użytkownik kliknij ikonę mikrofonu i powiedział coś wszystko jest w porządku 2-) Jeżeli użytkownik kliknie na ikonę mikrofonu i ponownie kliknąć na ikonę mikrofonu albo nie mówią nic, ja dostać onError i rodzaj błędu: ERROR_RECOGNIZER_BUSY

@Override 
public void onError(int error) { 
if ((error == SpeechRecognizer.ERROR_NO_MATCH) 
    || (error == SpeechRecognizer.ERROR_SPEECH_TIMEOUT)){ 

    } 
    else if(ERROR_RECOGNIZER_BUSY){ 
    } 

} 

Oto mój kod na liście startowej ening:

public void recognizeSpeechDirectly() 
    { 


     recognizer = SpeechRecognizer.createSpeechRecognizer(this.context); 
     recognizer.setRecognitionListener(this); 
     recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
     recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
     recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "org.twodee.andytest"); 
     recognizerIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true); 
     recognizer.startListening(recognizerIntent); 

    } 

chcę uruchomić ponownie słuchać kiedy pojawi ERROR_RECOGNIZER_BUSY,

Kolejny facet powiedział o tym błędzie na stackoverflow, ale nie jest jasne dla mnie i nie można go wdrożyć.

How to handle ERROR_RECOGNIZER_BUSY

góry dzięki

Odpowiedz

0

Masz ERROR_RECOGNIZER_BUSY bo nazywasz startListening dwa razy, gdy użytkownik kliknie przycisk i kliknie ponownie. Zmień swój kod następująco:

// class member 
private boolean mIsListening; 
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    ......... 
    recognizer = SpeechRecognizer.createSpeechRecognizer(this.context); 
    recognizer.setRecognitionListener(this); 
    recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "org.twodee.andytest"); 
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true); 
} 

A kiedy ikona kliknięciu

if (!mIslistening) 
{ 
    mIsListening = true;   
    recognizer.startListening(recognizerIntent); 
} 

@Override 
public void onError(int error) { 
if ((error == SpeechRecognizer.ERROR_NO_MATCH) 
    || (error == SpeechRecognizer.ERROR_SPEECH_TIMEOUT)){ 

    } 
    else if(ERROR_RECOGNIZER_BUSY){ 

    } 
    recognizer.startListening(recognizerIntent); 
} 

@Override 
    public void onPartialResults(Bundle partialResults) 
    { 
     mIsListening = false; 
     .......... 
    } 

@Override 
    public void onResults(Bundle results) 
    { 
     mIsListening = false; 
      .......... 
    } 
+1

Dzięki za odpowiedź Hoan ale kiedy odwołany recongnizer i ponownie słuchać w ** if (ERROR_RECOGNIZER_BUSY) **, zamiast wznawiać słuchanie tego samego powtórzenia błędu w nieskończonej pętli. – odincer

+0

Edytowałem swoją odpowiedź. –

+0

Witam Hoan, z pewnością zastosowałem to, co powiedziałeś, ale to nie działa dla mnie, czy masz działającą próbkę? Moja maszyna to samsung S3 z Androidem 4.1 przy okazji. – odincer

0

rozpocząć rozpoznawanie z: recognizeSpeechDirectly();

public void stopRecognition(){ 
     recognizer.destroy(); 
     recognizer = null; 

} 

public void onError(int error) { 
     stopRecognition(); 
} 

public void onResults(Bundle results){ 
     //Do something 
     stopRecognition(); 
} 

Działa naprawić "nie połączony z usługą rozpoznawania" i "ERROR_RECOGNIZER_BUSY" błędów