networking - Internal error using Network Service Discovery in Android -


during first implementation of nsdmanager using examples , tutorial on developer page , application started discovery , found devices.

however seems broken...

when program started, after initialization, code enters following method , run:

public void discoverservices() {     log.d(tag, "initializing discovery on nsd");     mnsdmanager.discoverservices(             service_type, nsdmanager.protocol_dns_sd, mdiscoverylistener); }  

the log-message received. after while (say approx 5 mins.) outputted program:

05-21 11:08:32.518: e/nsdcamera(12236): discovery failed: error code:0 05-21 11:08:32.518: w/dalvikvm(12236): threadid=12: thread exiting uncaught exception (group=0x40c9c930) 05-21 11:08:32.518: e/androidruntime(12236): fatal exception: nsdmanager 05-21 11:08:32.518: e/androidruntime(12236): java.lang.nullpointerexception 05-21 11:08:32.518: e/androidruntime(12236):    @ android.net.nsd.nsdmanager$servicehandler.handlemessage(nsdmanager.java:338) 05-21 11:08:32.518: e/androidruntime(12236):    @ android.os.handler.dispatchmessage(handler.java:99) 05-21 11:08:32.518: e/androidruntime(12236):    @ android.os.looper.loop(looper.java:137) 05-21 11:08:32.518: e/androidruntime(12236):    @ android.os.handlerthread.run(handlerthread.java:60) 

also services:

05-21 11:50:49.108: e/nativedaemonconnector.responsequeue(8858): timeout waiting response 05-21 11:50:49.108: e/mdnsconnector(8858): timed-out waiting response 10 mdnssd discover 6 _http._tcp. 05-21 11:50:49.108: e/nsdservice(8858): failed discoverservices com.android.server.nativedaemonconnector$nativedaemonfailureexception: command '10 mdnssd discover 6 _http._tcp.' failed 'null' 

error code "0" described in nsdmanager class internal error. major updates did access context in helper-class called nsdcamera. here evil code-snippets:

helper-class constructor:

public nsdcamera(camerachooseactivity context) {     mcontext = context;     updateui =  new updateui();     mnsdmanager = (nsdmanager) context.getsystemservice(context.nsd_service);     mservicename = new vector<nsdserviceinfo>(); 

helper-class nsd initialization:

public void initializensd() {     initializediscoverylistener(); }  public void initializediscoverylistener() {     mdiscoverylistener = new nsdmanager.discoverylistener() {          @override         public void ondiscoverystarted(string regtype) {             log.d(tag, "service discovery started");         }         /**          * name check see if dns discovery correct. checks if contains           * axis , has desired mac address-space          * @param hostname ,the inputted hostname discovery cycle          * @return true if it's axis camera.           */         public boolean namecheck(string hostname){             return (hostname.contains("axis") && hostname.contains("00408c"));          }         @override         public void onservicefound(nsdserviceinfo service) {             log.d(tag, "service discovery success: " + service.getservicename());             if (!service.getservicetype().equals(service_type)) {                 log.d(tag, "unknown service type: " + service.getservicetype());             } else if (namecheck(service.getservicename())){                 mservicename.add(service); //                  updateui.execute(new bundleui(mcontext,service, null));             }         }          @override         public void onservicelost(nsdserviceinfo service) {             log.e(tag, "service lost" + service);             if(mservicename.remove(service)){                 //todo                 log.e(tag, "remove view, service lost");             }         }          @override         public void ondiscoverystopped(string servicetype) {             log.i(tag, "discovery stopped: " + servicetype);             //necessary??             mservicename.clear();         }          @override         public void onstartdiscoveryfailed(string servicetype, int errorcode) {             log.e(tag, "discovery failed: error code:" + errorcode);             mnsdmanager.stopservicediscovery(this);         }          @override         public void onstopdiscoveryfailed(string servicetype, int errorcode) {             log.e(tag, "discovery failed: error code:" + errorcode);             mnsdmanager.stopservicediscovery(this);         }     }; } 

camerachooseactivity -> oncreate calling helper-class

protected void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);     setcontentview(r.layout.activity_camerachoose);      //setup animation text in relativelayout     mdescription = (textswitcher) findviewbyid(r.id.camera_add);     mdescription.setfactory(this);     mdescription.setinanimation(animationutils.loadanimation(this, android.r.anim.fade_in));     mdescription.setoutanimation(animationutils.loadanimation(this, android.r.anim.fade_out));     mdescription.settext(gettext(r.string.camera_add));      //building alert dialog     mbuilder = new alertdialog.builder(this,alertdialog.theme_holo_dark);     mbuilder.setmessage(r.string.dialog_about).settitle(r.string.action_about);     mbuilder.seticon(android.r.drawable.ic_dialog_info);      mlayout = (relativelayout) findviewbyid(r.id.layout_camerachoose);      //initialize nsd     mnsdhelper = new nsdcamera(this);     mnsdhelper.initializensd(); 

base on experience, suppose listener lifetime issue.

because supply 2 listeners system nsd service, 1 startservicediscovery() , stopservicediscovery(). need make sure these listeners still alive when system accesses these listeners.

one fact onstartdiscoveryfailed() called 2 minutes after startservicediscovery() called, should long time compared lifetime of listener.

so if listener local object , released after calling startservicediscovery(), maybe cause nsd service crash.

public void stopservicediscovery (nsdmanager.discoverylistener listener)

stop service discovery initiated discoverservices(). active service discovery notified application ondiscoverystarted(string) , stays active until application invokes stop service discovery. successful stop notified call ondiscoverystopped(string).

upon failure stop service discovery, application notified through onstopdiscoveryfailed(string, int).

parameters listener should listener object passed discoverservices(string, int, nsdmanager.discoverylistener). identifies discovery should stopped , notifies of successful stop.

and below snippet make sure not call nsdmanager api.

@override public void onstartdiscoveryfailed(string servicetype, int errorcode) {      log.i(tag, "onstartdiscoveryfailed : error code:" + errorcode); }  @override public void onstopdiscoveryfailed(string servicetype, int errorcode) {     log.i(tag, "onstopdiscoveryfailed : error code:" + errorcode); } 

good luck.


Comments

Popular posts from this blog

blackberry 10 - how to add multiple markers on the google map just by url? -

php - guestbook returning database data to flash -

delphi - Dynamic file type icon -