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
Post a Comment