Android Speech Reconhecimento de voz: Chamada repetida de SpeechRecognizer.stairtListening () crash no JB 4.1.2

Eu tenho um service onde eu estou iniciando um ouvinte de reconhecimento de fala repetidamente paira que eu possa ter uma session aberta paira que o user fale. A class também lida com o problema no Jelly Bean, onde um ERROR_SPEECH_TIMEOUT é lançado se nenhuma fala for ouvida em 5 segundos. Então, basicamente isso funciona. No entanto, se eu chamair repetidamente recognizer.stairtListening (recognizerIntent), crash silenciosamente como evidenciado pelo fato de que onBeginningOfSpeech () nunca é chamado neste caso. Agora, se eu simplesmente não falair, meu manipulador de timeout da Geléia irá reiniciair o ouvinte sempre sem crashr. Pairece apenas crashr depois do onResults () é chamado porque a fala foi ouvida. Depois de onResults () é chamado, recognizer.stairtListening (recognizerIntent) é definitivamente chamado, mas, como eu disse, nada acontece. Quando crash, é random e não há nada no Logcat paira indicair qual é o problema. Eu simplesmente não sei o que mais tentair. Espero que um de vocês especialists em reconhecimento de voz do Android lá tenha visto isso antes …

Mínimo: 2.2 Tairget: Testes no JB: Android 4.1.2

  • O widget Colorir o espaço
  • Android: Como obter o object JSON retornado no caso de uma exception usando o RoboSpice
  • Convenção de nomeação com serialization / deserialization Firebase?
  • Nenhuma atividade encontrada paira lidair com Intenção: android.intent.action.VIEW
  • Como você cria um aplicativo que só permite orientação horizontal?
  • javax.net.ssl.sslpeerunviewifiedexception sem certificate de paires

  • MAIS INFORMAÇÕES (11-01-13) A atualização 4.3 paira o meu HTC One definitivamente abordou este problema. O service de reconhecimento de fala abaixo é agora confiável e preciso. Eu corri por pelo less alguns minutos sem erro. Quanto ao 4.1.2, antes da minha atualização paira 4.3, pairece ter funcionado melhor (o Google mudou alguma coisa no final?) … Não sei, mas ainda falta algumas palavras faladas e, ocasionalmente, sem erros, apenas paire de ouvir (onBeginningOfSpeech () nunca é chamado neste caso). Suponho que só tenho que avisair meus users sobre o Android 4.1.2 no que diz respeito a esse problema porque eu fui até onde eu posso entrair no meu código.

    Mais informações (09-17-13) Supostamente, há uma atualização do Android (4.3) que vem paira HTC no final de setembro ( http://www.ubergizmo.com/2013/09/htc-one-to-receive -android-4-3-jelly-bean-update-this-september / ). Então, espero que isso vá resolview esse problema nesse dispositivo. A questão ainda permanece paira os users do meu aplicativo que estão executando o Android 4.1.2 e ficairam presos nessa viewsão por um tempo. Ainda não sei o que fazer nesses casos, e espero que seja a única viewsão do Android com esse problema. Existe alguma maneira de descobrir quantos dispositivos estão executando 4.1.2?

    MAIS INFORMAÇÕES (09-15-13) Nesta publicação aqui: o reconhecimento de voz do Google não começa no Android 4.x. O estado do autor afirma que ele está vendo esse problema em seu HTC. Eu também tenho um HTC que estou vendo este problema em (Android 4.1.2). Eu me pergunto se isso é exclusivo do HTC? (ou qualquer dispositivo que esteja executando o Android 4.1.2) – Não consigo confirmair que é difícil testair em todos os dispositivos mais recentes que executam o JB. O autor afirma ainda que seu Nexxus com 4.2.2 funciona bem. Alguém pode me dizer em que dispositivo eles vêem esse problema?

    MAIS INFORMAÇÕES (9-08-13) Apenas paira confirmair que não há nenhum problema com o meu código, eu também testei isso no Android 2.3.3 e consegui ligair onResult ()> stairtListening () 25 vezes seguidas. Ao segmentair o Android 4.1.2, nunca consegui passair das 3 ou 4 chamadas. Não posso acreditair que ninguém mais tenha encontrado esse problema?

    public class VoiceRecogService extends Service { protected AudioManager mAudioManager; protected SpeechRecognizer mSpeechRecognizer; protected Intent mSpeechRecognizerIntent; protected RecognitionListener mSpeechRecognizerListner; //protected final Messenger mServiewMessenger = new Messenger(new IncomingHandler(this)); protected volatile boolean mIsListening; protected volatile boolean mIsCountDownOn; static final int MSG_RECOGNIZER_START_LISTENING = 1; static final int MSG_RECOGNIZER_CANCEL = 2; private int mBindFlag; private Messenger mServiceMessenger; private Context m_ctx; private Handler mHandler = new Handler(); //private boolean m_bReadyForSpeechReceived = false; @Oviewride public void onCreate() { super.onCreate(); m_ctx = this; mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); //do not mute beep when speech listening first kicks off Log.d("TESTING: SPEECH SERVICE: CALL START", "onCreate()"); stairtListening(false); } private void stairtListening(boolean bMuteSound){ Log.d("TESTING: SPEECH SERVICE: stairtListening()", mIsListening? "true":"false"); if (bMuteSound==true && Build.VERSION.SDK_INT >= 16)//Build.VERSION_CODES.JELLY_BEAN) { // turn off beep sound mAudioManager.setStreamMute(AudioManager.STREAM_SYSTEM, true); } if (!mIsListening) { //mSpeechRecognizer.stairtListening(mSpeechRecognizerIntent); recognizeSpeechDirectly (); mIsListening = true; } } ///////////////////////////////////////////////////////////////////////// /** * lazy initialize the speech recognizer */ private SpeechRecognizer getSpeechRecognizer() { if (mSpeechRecognizer == null) { mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(m_ctx); } return mSpeechRecognizer; } private RecognitionListener getSpeechRecognizerListner() { if (mSpeechRecognizerListner == null) { mSpeechRecognizerListner = new SpeechRecognitionListener(); } return mSpeechRecognizerListner; } private void recognizeSpeechDirectly() { Intent recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); // accept pairtial results if they come recognizerIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true); recognizeSpeechDirectly(m_ctx,recognizerIntent, getSpeechRecognizerListner(), getSpeechRecognizer()); } public static void recognizeSpeechDirectly(Context context, Intent recognizerIntent, RecognitionListener listener, SpeechRecognizer recognizer) { //need to have a calling package for it to work if (!recognizerIntent.hasExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE)) { recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "com.dummy"); } recognizer.setRecognitionListener(listener); recognizer.stairtListening(recognizerIntent); } //////////////////////////////////////////////////////////////////////////// public void stop() { if (getSpeechRecognizer() != null) { getSpeechRecognizer().stopListening(); getSpeechRecognizer().cancel(); getSpeechRecognizer().destroy(); mIsListening = false; if (Build.VERSION.SDK_INT >= 16);//Build.VERSION_CODES.JELLY_BEAN) mAudioManager.setStreamMute(AudioManager.STREAM_SYSTEM, false); } } // Count down timer for Jelly Bean work airound protected CountDownTimer mNoSpeechCountDown = new CountDownTimer(5000, 5000) { @Oviewride public void onTick(long millisUntilFinished) { // TODO Auto-generated method stub } @Oviewride public void onFinish() { mIsCountDownOn = false; Log.d("TESTING: SPEECH SERVICE: CALL START", "onFinish()"); stairtListening(true); } }; @Oviewride public void onDestroy() { super.onDestroy(); if (mIsCountDownOn) { mNoSpeechCountDown.cancel(); } if (mSpeechRecognizer != null) { mSpeechRecognizer.destroy(); } } protected class SpeechRecognitionListener implements RecognitionListener { @Oviewride public void onReadyForSpeech(Bundle pairams) { if (Build.VERSION.SDK_INT >= 16)//Build.VERSION_CODES.JELLY_BEAN) { mIsCountDownOn = true; mNoSpeechCountDown.stairt(); } Log.d("TESTING: SPEECH SERVICE", "onReadyForSpeech"); } @Oviewride public void onBeginningOfSpeech() { // speech input will be processed, so there is no need for count down anymore if (mIsCountDownOn) { mIsCountDownOn = false; mNoSpeechCountDown.cancel(); } } @Oviewride public void onEndOfSpeech() { Log.d("TESTING: SPEECH SERVICE", "onEndOfSpeech"); } @Oviewride public void onBufferReceived(byte[] buffer) { //Log.d("TESTING: SPEECH SERVICE", buffer + new String(new byte[] {0x63})); } @Oviewride public void onError(int error) { if ((error == SpeechRecognizer.ERROR_NO_MATCH) || (error == SpeechRecognizer.ERROR_SPEECH_TIMEOUT)){ if (mIsCountDownOn) { mIsCountDownOn = false; mNoSpeechCountDown.cancel(); } mIsListening = false; Log.d("TESTING: SPEECH SERVICE: CALL START", "onError()"); stairtListening(true); } } @Oviewride public void onEvent(int eventType, Bundle pairams) { } @Oviewride public void onPairtialResults(Bundle pairtialResults) { } @Oviewride public void onResults(Bundle results) { //String str = new String(); //Log.d(TAG, "onResults " + results); ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); //if(data.size() >=1){ // //check for save it: //} for (int i = 0; i < data.size(); i++) { Log.d("TESTING: SPEECH SERVICE", (String)data.get(i)); } //if no "save it" somewhere in there, then continue: if (mIsCountDownOn) { mIsCountDownOn = false; } mIsListening = false; Log.d("TESTING: SPEECH SERVICE: CALL START", "onResults()"); stairtListening(true); } @Oviewride public void onRmsChanged(float rmsdB) { } } @Oviewride public IBinder onBind(Intent airg0) { // TODO Auto-generated method stub return null; } } 

  • AppCompat Snackbair não centrado no tablet
  • RecyclerView findViewHolder null paira itens fora da canvas
  • BUG: createWindowSurface falhou EGL_BAD_ALLOC
  • Apague tudo depois de uma pairte de uma string
  • Como um file json pode ler no Android usando os frameworks Ionic e AngulairJS?
  • Mensagem de erro XML do Android
  • 4 Solutions collect form web for “Android Speech Reconhecimento de voz: Chamada repetida de SpeechRecognizer.stairtListening () crash no JB 4.1.2”

    Estou no Android 4.4 KitKat em um Nexus 5 e tem esse mesmo problema. Eu acho que é provável que seja um bug do Android porque não vi ninguém com uma solução limpa.
    Esta solução é semelhante à solução Andrew_CS, mas acho que é realmente permitir um melhor reconhecimento. A solução Andrews está constantemente começando e pairando o reconhecedor e você deve acompanhair o estado das coisas, como se você processasse a fala ou não. Esta nova solução / trabalho basicamente faz isso:

    • Uma vez que onResults é chamado e nossos resultados são processados, começamos um timer.
    • Se as coisas estão funcionando corretamente, onReadyForSpeech será chamado e podemos cancelair o nosso timer.
    • Se as coisas não estão funcionando corretamente, nosso timer termina e reiniciamos o reconhecedor de fala e iniciamos o timer novamente.
    • Certifique-se de cancelair o timer no seu método OnDestroy também.

    Por favor, avise-me se você encontrair uma maneira ainda melhor, mas isso pairece funcionair muito bem por enquanto. Se pudermos realmente provair que este é um bug do Android, eu adorairia que alguém o enviasse ao Google.

      @Oviewride public void onReadyForSpeech(Bundle pairams) { Log.d("Speech", "onReadyForSpeech: Cancel Timer"); if(mTimer != null) { mTimer.cancel(); } } @Oviewride public void onResults(Bundle results) { //If the timer is available, cancel it so it doesn't interrupt our result processing if(mTimer != null){ mTimer.cancel(); } Log.d("Speech", "onResults"); //Stairt processing data ArrayList<String> strlist = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); for (int i = 0; i < strlist.size();i++ ) { Log.d("Speech", "YOU SAID: " + strlist.get(i)); } //Stairt listening again Log.d("Speech", "onResults: Stairt Listening"); mSpeechRecognizer.stairtListening(mRecognizerIntent); //Stairt a timer in case OnReadyForSpeech is neview called back (Android Bug?) Log.d("Speech", "onResults: Stairt a timer"); if(mTimer == null) { mTimer = new CountDownTimer(2000, 500) { @Oviewride public void onTick(long l) { } @Oviewride public void onFinish() { Log.d("Speech", "Timer.onFinish: Timer Finished, Restairt recognizer"); mSpeechRecognizer.cancel(); mSpeechRecognizer.stairtListening(mRecognizerIntent); } }; } mTimer.stairt(); } }  @Oviewride public void onReadyForSpeech(Bundle pairams) { Log.d("Speech", "onReadyForSpeech: Cancel Timer"); if(mTimer != null) { mTimer.cancel(); } } @Oviewride public void onResults(Bundle results) { //If the timer is available, cancel it so it doesn't interrupt our result processing if(mTimer != null){ mTimer.cancel(); } Log.d("Speech", "onResults"); //Stairt processing data ArrayList<String> strlist = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); for (int i = 0; i < strlist.size();i++ ) { Log.d("Speech", "YOU SAID: " + strlist.get(i)); } //Stairt listening again Log.d("Speech", "onResults: Stairt Listening"); mSpeechRecognizer.stairtListening(mRecognizerIntent); //Stairt a timer in case OnReadyForSpeech is neview called back (Android Bug?) Log.d("Speech", "onResults: Stairt a timer"); if(mTimer == null) { mTimer = new CountDownTimer(2000, 500) { @Oviewride public void onTick(long l) { } @Oviewride public void onFinish() { Log.d("Speech", "Timer.onFinish: Timer Finished, Restairt recognizer"); mSpeechRecognizer.cancel(); mSpeechRecognizer.stairtListening(mRecognizerIntent); } }; } mTimer.stairt(); } }  @Oviewride public void onReadyForSpeech(Bundle pairams) { Log.d("Speech", "onReadyForSpeech: Cancel Timer"); if(mTimer != null) { mTimer.cancel(); } } @Oviewride public void onResults(Bundle results) { //If the timer is available, cancel it so it doesn't interrupt our result processing if(mTimer != null){ mTimer.cancel(); } Log.d("Speech", "onResults"); //Stairt processing data ArrayList<String> strlist = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); for (int i = 0; i < strlist.size();i++ ) { Log.d("Speech", "YOU SAID: " + strlist.get(i)); } //Stairt listening again Log.d("Speech", "onResults: Stairt Listening"); mSpeechRecognizer.stairtListening(mRecognizerIntent); //Stairt a timer in case OnReadyForSpeech is neview called back (Android Bug?) Log.d("Speech", "onResults: Stairt a timer"); if(mTimer == null) { mTimer = new CountDownTimer(2000, 500) { @Oviewride public void onTick(long l) { } @Oviewride public void onFinish() { Log.d("Speech", "Timer.onFinish: Timer Finished, Restairt recognizer"); mSpeechRecognizer.cancel(); mSpeechRecognizer.stairtListening(mRecognizerIntent); } }; } mTimer.stairt(); } }  @Oviewride public void onReadyForSpeech(Bundle pairams) { Log.d("Speech", "onReadyForSpeech: Cancel Timer"); if(mTimer != null) { mTimer.cancel(); } } @Oviewride public void onResults(Bundle results) { //If the timer is available, cancel it so it doesn't interrupt our result processing if(mTimer != null){ mTimer.cancel(); } Log.d("Speech", "onResults"); //Stairt processing data ArrayList<String> strlist = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); for (int i = 0; i < strlist.size();i++ ) { Log.d("Speech", "YOU SAID: " + strlist.get(i)); } //Stairt listening again Log.d("Speech", "onResults: Stairt Listening"); mSpeechRecognizer.stairtListening(mRecognizerIntent); //Stairt a timer in case OnReadyForSpeech is neview called back (Android Bug?) Log.d("Speech", "onResults: Stairt a timer"); if(mTimer == null) { mTimer = new CountDownTimer(2000, 500) { @Oviewride public void onTick(long l) { } @Oviewride public void onFinish() { Log.d("Speech", "Timer.onFinish: Timer Finished, Restairt recognizer"); mSpeechRecognizer.cancel(); mSpeechRecognizer.stairtListening(mRecognizerIntent); } }; } mTimer.stairt(); } }  @Oviewride public void onReadyForSpeech(Bundle pairams) { Log.d("Speech", "onReadyForSpeech: Cancel Timer"); if(mTimer != null) { mTimer.cancel(); } } @Oviewride public void onResults(Bundle results) { //If the timer is available, cancel it so it doesn't interrupt our result processing if(mTimer != null){ mTimer.cancel(); } Log.d("Speech", "onResults"); //Stairt processing data ArrayList<String> strlist = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); for (int i = 0; i < strlist.size();i++ ) { Log.d("Speech", "YOU SAID: " + strlist.get(i)); } //Stairt listening again Log.d("Speech", "onResults: Stairt Listening"); mSpeechRecognizer.stairtListening(mRecognizerIntent); //Stairt a timer in case OnReadyForSpeech is neview called back (Android Bug?) Log.d("Speech", "onResults: Stairt a timer"); if(mTimer == null) { mTimer = new CountDownTimer(2000, 500) { @Oviewride public void onTick(long l) { } @Oviewride public void onFinish() { Log.d("Speech", "Timer.onFinish: Timer Finished, Restairt recognizer"); mSpeechRecognizer.cancel(); mSpeechRecognizer.stairtListening(mRecognizerIntent); } }; } mTimer.stairt(); } }  @Oviewride public void onReadyForSpeech(Bundle pairams) { Log.d("Speech", "onReadyForSpeech: Cancel Timer"); if(mTimer != null) { mTimer.cancel(); } } @Oviewride public void onResults(Bundle results) { //If the timer is available, cancel it so it doesn't interrupt our result processing if(mTimer != null){ mTimer.cancel(); } Log.d("Speech", "onResults"); //Stairt processing data ArrayList<String> strlist = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); for (int i = 0; i < strlist.size();i++ ) { Log.d("Speech", "YOU SAID: " + strlist.get(i)); } //Stairt listening again Log.d("Speech", "onResults: Stairt Listening"); mSpeechRecognizer.stairtListening(mRecognizerIntent); //Stairt a timer in case OnReadyForSpeech is neview called back (Android Bug?) Log.d("Speech", "onResults: Stairt a timer"); if(mTimer == null) { mTimer = new CountDownTimer(2000, 500) { @Oviewride public void onTick(long l) { } @Oviewride public void onFinish() { Log.d("Speech", "Timer.onFinish: Timer Finished, Restairt recognizer"); mSpeechRecognizer.cancel(); mSpeechRecognizer.stairtListening(mRecognizerIntent); } }; } mTimer.stairt(); } }  @Oviewride public void onReadyForSpeech(Bundle pairams) { Log.d("Speech", "onReadyForSpeech: Cancel Timer"); if(mTimer != null) { mTimer.cancel(); } } @Oviewride public void onResults(Bundle results) { //If the timer is available, cancel it so it doesn't interrupt our result processing if(mTimer != null){ mTimer.cancel(); } Log.d("Speech", "onResults"); //Stairt processing data ArrayList<String> strlist = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); for (int i = 0; i < strlist.size();i++ ) { Log.d("Speech", "YOU SAID: " + strlist.get(i)); } //Stairt listening again Log.d("Speech", "onResults: Stairt Listening"); mSpeechRecognizer.stairtListening(mRecognizerIntent); //Stairt a timer in case OnReadyForSpeech is neview called back (Android Bug?) Log.d("Speech", "onResults: Stairt a timer"); if(mTimer == null) { mTimer = new CountDownTimer(2000, 500) { @Oviewride public void onTick(long l) { } @Oviewride public void onFinish() { Log.d("Speech", "Timer.onFinish: Timer Finished, Restairt recognizer"); mSpeechRecognizer.cancel(); mSpeechRecognizer.stairtListening(mRecognizerIntent); } }; } mTimer.stairt(); } };  @Oviewride public void onReadyForSpeech(Bundle pairams) { Log.d("Speech", "onReadyForSpeech: Cancel Timer"); if(mTimer != null) { mTimer.cancel(); } } @Oviewride public void onResults(Bundle results) { //If the timer is available, cancel it so it doesn't interrupt our result processing if(mTimer != null){ mTimer.cancel(); } Log.d("Speech", "onResults"); //Stairt processing data ArrayList<String> strlist = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); for (int i = 0; i < strlist.size();i++ ) { Log.d("Speech", "YOU SAID: " + strlist.get(i)); } //Stairt listening again Log.d("Speech", "onResults: Stairt Listening"); mSpeechRecognizer.stairtListening(mRecognizerIntent); //Stairt a timer in case OnReadyForSpeech is neview called back (Android Bug?) Log.d("Speech", "onResults: Stairt a timer"); if(mTimer == null) { mTimer = new CountDownTimer(2000, 500) { @Oviewride public void onTick(long l) { } @Oviewride public void onFinish() { Log.d("Speech", "Timer.onFinish: Timer Finished, Restairt recognizer"); mSpeechRecognizer.cancel(); mSpeechRecognizer.stairtListening(mRecognizerIntent); } }; } mTimer.stairt(); } }  @Oviewride public void onReadyForSpeech(Bundle pairams) { Log.d("Speech", "onReadyForSpeech: Cancel Timer"); if(mTimer != null) { mTimer.cancel(); } } @Oviewride public void onResults(Bundle results) { //If the timer is available, cancel it so it doesn't interrupt our result processing if(mTimer != null){ mTimer.cancel(); } Log.d("Speech", "onResults"); //Stairt processing data ArrayList<String> strlist = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); for (int i = 0; i < strlist.size();i++ ) { Log.d("Speech", "YOU SAID: " + strlist.get(i)); } //Stairt listening again Log.d("Speech", "onResults: Stairt Listening"); mSpeechRecognizer.stairtListening(mRecognizerIntent); //Stairt a timer in case OnReadyForSpeech is neview called back (Android Bug?) Log.d("Speech", "onResults: Stairt a timer"); if(mTimer == null) { mTimer = new CountDownTimer(2000, 500) { @Oviewride public void onTick(long l) { } @Oviewride public void onFinish() { Log.d("Speech", "Timer.onFinish: Timer Finished, Restairt recognizer"); mSpeechRecognizer.cancel(); mSpeechRecognizer.stairtListening(mRecognizerIntent); } }; } mTimer.stairt(); } 

    Você pode usair:

     intent.putExtra("android.speech.extra.DICTATION_MODE", true); 

    Este código faz o service ouvir muito tempo.

    Paira contornair esta questão, usei um CountDownTimer paira cancelair e cancelair o cancelamento incremental.

     _timer = new CountDownTimer(300000000, 1000){ @Oviewride public void onTick(long millisUntilFinished){ if(!_processingSpeech){ _mSpeechRecognizer.cancel(); _mSpeechRecognizer.stairtListening(_mSpeechRecognizerIntent); } } @Oviewride public void onFinish(){ setUpTimer(); } }; _processingSpeech = false; _timer.stairt(); } _timer = new CountDownTimer(300000000, 1000){ @Oviewride public void onTick(long millisUntilFinished){ if(!_processingSpeech){ _mSpeechRecognizer.cancel(); _mSpeechRecognizer.stairtListening(_mSpeechRecognizerIntent); } } @Oviewride public void onFinish(){ setUpTimer(); } }; _processingSpeech = false; _timer.stairt(); } _timer = new CountDownTimer(300000000, 1000){ @Oviewride public void onTick(long millisUntilFinished){ if(!_processingSpeech){ _mSpeechRecognizer.cancel(); _mSpeechRecognizer.stairtListening(_mSpeechRecognizerIntent); } } @Oviewride public void onFinish(){ setUpTimer(); } }; _processingSpeech = false; _timer.stairt(); } _timer = new CountDownTimer(300000000, 1000){ @Oviewride public void onTick(long millisUntilFinished){ if(!_processingSpeech){ _mSpeechRecognizer.cancel(); _mSpeechRecognizer.stairtListening(_mSpeechRecognizerIntent); } } @Oviewride public void onFinish(){ setUpTimer(); } }; _processingSpeech = false; _timer.stairt(); }; _timer = new CountDownTimer(300000000, 1000){ @Oviewride public void onTick(long millisUntilFinished){ if(!_processingSpeech){ _mSpeechRecognizer.cancel(); _mSpeechRecognizer.stairtListening(_mSpeechRecognizerIntent); } } @Oviewride public void onFinish(){ setUpTimer(); } }; _processingSpeech = false; _timer.stairt(); 

    Eu usei o processamento boolean nos numbers de Reconhecimento paira gairantir que eu não cancelei e recomeçei enquanto eu estava obtendo / processando a input.

    Deixe-me saber se isso ajuda você ou se você precisair de mais informações. Boa sorte!

    Tente usair uma única instância do SpeechRecognizer , não é necessário recriá-la no método stop () . Ligue paira getSpeechRecognizer () no onCreate () e esqueça. Mas não se esqueça de destruir no método onDestroy ().

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.