2013-05-21 13 views
7

Während der ersten Implementierung des NSDManager mit den Beispielen und der tutorial on the developer page hat die Anwendung die Erkennung erfolgreich gestartet und die Geräte gefunden.Interner Fehler bei Verwendung der Netzwerkdienstsuche in Android

aber jetzt scheint es, um gebrochen zu werden ...

Wenn das Programm gestartet wird, nach einiger Initialisierung der Code tritt in das folgende Verfahren und erfolgreich ausgeführt:

public void discoverServices() { 
    Log.d(TAG, "Initializing discovery on NSD"); 
    mNsdManager.discoverServices(
      SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener); 
} 

Die Log- Nachricht wird empfangen. Nach einer guten Weile (sagt ca. 5 Min.) Das aus dem Programm ausgegeben wird:

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 Leistungen:

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' 

Fehlercode "0" in den NSDManager class beschrieben als ein interner Fehler Die wichtigsten Updates, die ich gemacht habe, war der Zugriff auf den Kontext in der Helper-Klasse namens NsdCamera. ist hier einige wahrscheinlich bösen Code-Schnipsel:

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 Aufruf der Helfer-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(); 

Antwort

3

Basis auf meiner Erfahrung, ich nehme an, das Problem ein Zuhörer Lebensdauer ist.

Da Sie dem System-NSD-Dienst zwei Listener bereitstellen, ist einer für startServiceDiscovery() und ein anderer für stopServiceDiscovery(). Sie müssen sicherstellen, dass diese Listener noch aktiv sind, wenn das System auf diese Listener zugreift.

Eine Tatsache ist, dass onStartDiscoveryFailed() 2 Minuten nach dem Start von startServiceDiscovery() aufgerufen wird, sollte es eine lange Zeit im Vergleich zu der Lebensdauer des Listeners sein.

Wenn also der Listener ein lokales Objekt ist und nach dem Aufruf von startServiceDiscovery() freigegeben wird, kann dies zum Absturz des NSD-Dienstes führen.

public void stopServiceDiscovery (NsdManager.DiscoveryListener Hörer)

Stop-Service-Discovery mit discoverServices initiiert().Eine aktive Serviceerkennung wird der Anwendung mit onDiscoveryStarted (String) gemeldet, und sie bleibt so lange aktiv, bis die Anwendung eine Service-Feststellungsaufforderung aufruft. Ein erfolgreicher Stopp wird mit einem Aufruf von onDiscoveryStopped (String) an gemeldet.

Bei fehlgeschlagener Dienstsuche wird die Anwendung über onStopDiscoveryFailed (String, int) über benachrichtigt.

Parameter Listener Dies sollte das Listener-Objekt sein, das an discoverServices (String, int, NsdManager.DiscoveryListener) übergeben wurde. Es identifiziert die Entdeckung, die beendet werden sollte, und benachrichtigt einen erfolgreichen Stopp.

und unter Snippet stellen Sie sicher, rufen Sie keine 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); 
} 

Viel Glück.

+0

Schöne Antwort! Danke für die Hilfe. Nun, es hat tatsächlich den Nullzeiger gelöst! Der "interne Fehler" (Fehlercode 0) bleibt jedoch bestehen: S – Mazze

3

Ein einfacher Neustart des Prüflings erwies sich als die Lösung. Muss sagen, dass der Fehler ziemlich seltsam ist. Ich denke, der Daemon ist abgestürzt und hat nicht neu gestartet.

(Wenn jemand eine Analyse veröffentlichen kann oder hat eine viel bessere Lösung, bitte posten)

+0

Was ist DUT? Ich habe den gleichen Fehler, aber mein Gerät startet sich neu. – fsschmitt

+0

DUT = Gerät im Test. Viele haben das Problem, einige Geräte starten wegen des Daemon-Absturzes neu, aber min nicht ... http://stackoverflow.com/questions/16907102/android-network-printers-discovery-nullpointerexception – Mazze

+0

nicht wirklich sicher Wenn dies als die richtige Antwort markiert werden sollte –