android - Understanding code running recognition as a service -


i've been stuck on last 5 hours...and i'm coming guys help. have read this:

android speech recognition service on android 4.1 & 4.2

the code answer suggests following:

public class myservice extends service {     protected audiomanager maudiomanager;      protected speechrecognizer mspeechrecognizer;     protected intent mspeechrecognizerintent;     protected final messenger mservermessenger = new messenger(new incominghandler(this));      protected boolean mislistening;     protected volatile boolean miscountdownon;     private boolean misstreamsolo;      static final int msg_recognizer_start_listening = 1;     static final int msg_recognizer_cancel = 2;      @override     public void oncreate()     {         super.oncreate();         maudiomanager = (audiomanager) getsystemservice(context.audio_service);          mspeechrecognizer = speechrecognizer.createspeechrecognizer(this);         mspeechrecognizer.setrecognitionlistener(new speechrecognitionlistener());         mspeechrecognizerintent = new intent(recognizerintent.action_recognize_speech);         mspeechrecognizerintent.putextra(recognizerintent.extra_language_model,                                          recognizerintent.language_model_free_form);         mspeechrecognizerintent.putextra(recognizerintent.extra_calling_package,                                          this.getpackagename());     }      protected static class incominghandler extends handler     {         private weakreference<myservice> mtarget;          incominghandler(myservice target)         {             mtarget = new weakreference<myservice>(target);         }           @override         public void handlemessage(message msg)         {             final myservice target = mtarget.get();              switch (msg.what)             {                 case msg_recognizer_start_listening:                      if (build.version.sdk_int >= build.version_codes.jelly_bean)                     {                         // turn off beep sound                           if (!misstreamsolo)                         {                             maudiomanager.setstreamsolo(audiomanager.stream_voice_call, true);                             misstreamsolo = true;                         }                     }                      if (!target.mislistening)                      {                          target.mspeechrecognizer.startlistening(target.mspeechrecognizerintent);                          target.mislistening = true;                         //log.d(tag, "message start listening"); //$non-nls-1$                      }                      break;                   case msg_recognizer_cancel:                     if (misstreamsolo)                    {                         maudiomanager.setstreamsolo(audiomanager.stream_voice_call, false);                         misstreamsolo = false;                    }                       target.mspeechrecognizer.cancel();                       target.mislistening = false;                       //log.d(tag, "message canceled recognizer"); //$non-nls-1$                       break;              }        }      }       // count down timer jelly bean work around     protected countdowntimer mnospeechcountdown = new countdowntimer(5000, 5000)     {          @override         public void ontick(long millisuntilfinished)         {             // todo auto-generated method stub          }          @override         public void onfinish()         {             miscountdownon = false;             message message = message.obtain(null, msg_recognizer_cancel);             try             {                 mservermessenger.send(message);                 message = message.obtain(null, msg_recognizer_start_listening);                 mservermessenger.send(message);             }             catch (remoteexception e)             {              }         }     };      @override     public void ondestroy()     {         super.ondestroy();          if (miscountdownon)         {             mnospeechcountdown.cancel();         }         if (mspeechrecognizer != null)         {             mspeechrecognizer.destroy();         }     }      protected class speechrecognitionlistener implements recognitionlistener     {          @override         public void onbeginningofspeech()         {             // speech input processed, there no need count down anymore             if (miscountdownon)             {                 miscountdownon = false;                 mnospeechcountdown.cancel();             }                            //log.d(tag, "onbeginingofspeech"); //$non-nls-1$         }          @override         public void onbufferreceived(byte[] buffer)         {          }          @override         public void onendofspeech()         {             //log.d(tag, "onendofspeech"); //$non-nls-1$          }          @override         public void onerror(int error)         {             if (miscountdownon)             {                 miscountdownon = false;                 mnospeechcountdown.cancel();             }              mislistening = false;              message message = message.obtain(null, msg_recognizer_start_listening);              try              {                     mservermessenger.send(message);              }              catch (remoteexception e)              {               }             //log.d(tag, "error = " + error); //$non-nls-1$         }          @override         public void onevent(int eventtype, bundle params)         {          }          @override         public void onpartialresults(bundle partialresults)         {          }          @override         public void onreadyforspeech(bundle params)         {             if (build.version.sdk_int >= build.version_codes.jelly_bean)             {                 miscountdownon = true;                 mnospeechcountdown.start();              }             log.d(tag, "onreadyforspeech"); //$non-nls-1$         }          @override         public void onresults(bundle results)         {             //log.d(tag, "onresults"); //$non-nls-1$          }          @override         public void onrmschanged(float rmsdb)         {          }      } } 

i confused on incominghandler.class does, , method calls handlemessage . im confused on how code continuously running, because don't see listener getting re-instantiated after onresults. can mind explaining? maybe adding comments in me understand? much!

i confused on incominghandler.class does, , method calls handlemessage

handler handles messages within service. required use handler , timer because can not restart recognizer immediately, need give time , restart.

handlemessage called messenger code when send message messenger. can read class description here:

https://developer.android.com/guide/components/bound-services.html#messenger

message sent when timeout expired following lines:

            mservermessenger.send(message);             message = message.obtain(null, msg_recognizer_start_listening);             mservermessenger.send(message) 

because don't see listener getting re-instantiated after onresults.

right, not restart directly, instead starts timer in

    public void onreadyforspeech(bundle params)             mnospeechcountdown.start(); 

and timer when ready sends message

           @override     public void onfinish()     {         miscountdownon = false;         message message = message.obtain(null, msg_recognizer_cancel);         try         {             mservermessenger.send(message);             message = message.obtain(null, msg_recognizer_start_listening);             mservermessenger.send(message);         }     } 

Comments

Popular posts from this blog

get url and add instance to a model with prefilled foreign key :django admin -

css - Make div keyboard-scrollable in jQuery Mobile? -

ruby on rails - Seeing duplicate requests handled with Unicorn -