Interner Fehler mit Netzwerk-Service Discovery in Android
Während der ersten Umsetzung der NSDManager anhand der Beispiele und der tutorial auf der Entwickler-Seite , die Anwendung erfolgreich gestartet die Entdeckung und fand den Geräten.
Aber jetzt scheint es kaputt zu sein...
Wenn das Programm gestartet wird, nach einigen Initialisierung, den code eingibt, wird die folgende Methode und erfolgreich führen:
public void discoverServices() {
Log.d(TAG, "Initializing discovery on NSD");
mNsdManager.discoverServices(
SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
}
Log-Nachricht empfangen wird. Nach einer guten Weile (sagen wir ca 5 Minuten.) dies ist ausgegeben, die aus dem Programm:
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 with 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): at android.net.nsd.NsdManager$ServiceHandler.handleMessage(NsdManager.java:338)
05-21 11:08:32.518: E/AndroidRuntime(12236): at android.os.Handler.dispatchMessage(Handler.java:99)
05-21 11:08:32.518: E/AndroidRuntime(12236): at android.os.Looper.loop(Looper.java:137)
05-21 11:08:32.518: E/AndroidRuntime(12236): at android.os.HandlerThread.run(HandlerThread.java:60)
Auch von den Diensten:
05-21 11:50:49.108: E/NativeDaemonConnector.ResponseQueue(8858): Timeout waiting for response
05-21 11:50:49.108: E/mDnsConnector(8858): timed-out waiting for response to 10 mdnssd discover 6 _http._tcp.
05-21 11:50:49.108: E/NsdService(8858): Failed to discoverServices com.android.server.NativeDaemonConnector$NativeDaemonFailureException: command '10 mdnssd discover 6 _http._tcp.' failed with 'null'
Fehler-code "0" beschrieben wird, in der NSDManager Klasse als einen internen Fehler.
Die wichtigsten updates, die ich gemacht habe, war der Zugriff auf den Kontext in der helper-Klasse namens NsdCamera.
Hier ist wahrscheinlich einige böse code-snippets:
Helper-Klasse-Konstruktor:
public NsdCamera(CameraChooseActivity context) {
mContext = context;
updateUI = new UpdateUI();
mNsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE);
mServiceName = new Vector<NsdServiceInfo>();
Helper-Klasse NSD Initialisierung:
public void initializeNsd() {
initializeDiscoveryListener();
}
public void initializeDiscoveryListener() {
mDiscoveryListener = new NsdManager.DiscoveryListener() {
@Override
public void onDiscoveryStarted(String regType) {
Log.d(TAG, "Service discovery started");
}
/**
* A name check to see if the DNS discovery was correct. Checks if it contains
* AXIS and has the desired MAC address-space
* @param hostname ,the inputted hostname from the discovery cycle
* @return true if it's an 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 the view, service is 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 ist dem Aufruf der helper-Klasse
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camerachoose);
//Setup the animation for the text in the 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 the NSD
mNSDHelper = new NsdCamera(this);
mNSDHelper.initializeNsd();
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basis auf meiner Erfahrung, ich nehme an, dies ist ein listener Lebensdauer Ausgabe.
Weil Sie liefern zwei Listener, um das system NSD-service, ist für startServiceDiscovery() und eine für stopServiceDiscovery(). Sie müssen sicherstellen, dass diese Zuhörer noch am Leben, wenn das system greift auf diese für die Zuhörer.
Eine Tatsache ist, dass onStartDiscoveryFailed() aufgerufen wird 2 Minuten nach startServiceDiscovery() wird aufgerufen, es sollte eine lange Zeit im Vergleich zu der Lebenszeit des Hörers.
So, wenn der Hörer ein lokales Objekt sein und erscheint nach dem Aufruf der startServiceDiscovery(), der es vielleicht Ursache der NSD-Dienst zum Absturz zu bringen.
und unten snippet stellen Sie sicher nicht anrufen NsdManager api.
Glück.
Einen einfachen Neustart des DUT erwies sich als die Lösung. Muss sagen, dass der Fehler ist ziemlich seltsam.
Ich denke, dass der daemon abgestürzt und hat sich nicht neu starten.
(Wenn jemand posten kann, eine Analyse oder eine viel bessere Lösung ist, bitte posten)