2013-05-21 28 views
7

Durante la prima implementazione di NSDManager utilizzando gli esempi e tutorial on the developer page, l'applicazione ha avviato correttamente il rilevamento e trovato i dispositivi.Errore interno durante l'utilizzo di Network Service Discovery in Android

Tuttavia ora sembra essere rotto ...

Quando si avvia il programma, dopo un po 'l'inizializzazione, il codice inserisce il seguente metodo ed eseguire con successo:

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

Il log- messaggio è ricevuto. Dopo un bel po '(diciamo circa 5 min.) Questo viene emesso dal programma:

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) 

anche dai servizi:

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' 

codice di errore "0" è descritto nel NSDManager class come un errore interno I principali aggiornamenti che ho fatto è stato l'accesso al contesto nella classe helper chiamata NsdCamera. Ecco alcuni probabilmente male code-frammenti:

Helper-costruttore di classe:

public NsdCamera(CameraChooseActivity context) { 
    mContext = context; 
    updateUI = new UpdateUI(); 
    mNsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE); 
    mServiceName = new Vector<NsdServiceInfo>(); 

Helper classe NSD inizializzazione:

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 è chiamando la classe helper

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(); 

risposta

3

base alla mia esperienza, suppongo che questo è un problema di chi ascolta tutta la vita.

Poiché si forniscono due listener al servizio NSD di sistema, uno è per startServiceDiscovery() e un altro per stopServiceDiscovery(). è necessario assicurarsi che questi ascoltatori siano ancora vivi quando il sistema accede a questi listener.

Un fatto è che onStartDiscoveryFailed() viene chiamato 2 minuti dopo l'avvio di startServiceDiscovery(), dovrebbe essere un tempo lungo rispetto alla durata del listener.

Quindi se il listener è un oggetto locale e viene rilasciato dopo aver chiamato startServiceDiscovery(), potrebbe causare l'arresto anomalo del servizio NSD.

pubblico stopServiceDiscovery void (NsdManager.DiscoveryListener ascoltatore)

service discovery arresto avviata con discoverServices().Un rilevamento del servizio attivo viene notificato all'applicazione con onDiscoveryStarted (String) e rimane attivo fino a quando l'applicazione richiama un rilevamento del servizio di arresto. Una fermata andata a buon fine viene notificata a con una chiamata a onDiscoveryStopped (String).

In caso di interruzione del rilevamento del servizio, l'applicazione viene notificata tramite onStopDiscoveryFailed (String, int).

Parametro listener Questo dovrebbe essere l'oggetto listener che è stato passato a per scoprireServices (String, int, NsdManager.DiscoveryListener). Lo standard identifica il rilevamento che deve essere interrotto e notifica un arresto con esito positivo a .

e sotto snippet assicuratevi di non chiamare nessuna 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); 
} 

Buona fortuna.

+0

Bella risposta! grazie per l'aiuto. Bene, in realtà ha risolto il puntatore nullo! Tuttavia "l'errore interno" (codice di errore 0) persiste ancora: S – Mazze

3

Un semplice riavvio del DUT si è dimostrato la soluzione. Devo dire che l'errore è piuttosto strano. Penso che il demone si sia bloccato e non si sia riavviato.

(Se qualcuno può pubblicare un'analisi o di avere una soluzione molto migliore, si prega di postare)

+0

Che cos'è DUT? Sto avendo lo stesso errore, ma il mio dispositivo si riavvia da solo. – fsschmitt

+0

DUT = Dispositivo in test. Molti hanno il problema, alcuni dispositivi riavviare a causa del crollo daemon, tuttavia min non lo fa ... http://stackoverflow.com/questions/16907102/android-network-printers-discovery-nullpointerexception – Mazze

+0

non proprio sicuro se questo dovrebbe essere contrassegnato come la risposta giusta –