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