2013-08-07 5 views
6

Ich versuche, den mHost der NsdServiceInfo als Parameter an NsdManager.DiscoveryListener.onServiceFound() übergeben, aber es ist null. Ich habe zwei Android-Geräte, wobei Gerät 1 der Server und Gerät 2 der Client ist. DieseHost ist Null in NsdServiceInfo von NsdManager.DiscoveryListener.onServiceFound

ist, wie ich den Server in dem Gerät 1

public void registerService(int port, InetAddress myIp) { 
    NsdServiceInfo serviceInfo = new NsdServiceInfo(); 
    serviceInfo.setPort(port); 
    serviceInfo.setServiceName(this.serviceName); 
    serviceInfo.setServiceType(SERVICE_TYPE); 
    serviceInfo.setHost(myIp); 

    this.nsdManager.registerService(
      serviceInfo, NsdManager.PROTOCOL_DNS_SD, registrationListener); 
} 

registrieren Und das ist, wie ich die Discovery initialisieren

public void initializeDiscoveryListener() { 
    discoveryListener = new NsdManager.DiscoveryListener() { 

     @Override 
     public void onServiceFound(NsdServiceInfo service) { 
      Log.d(TAG, "Service discovery success" + service); 
      if (!service.getServiceType().equals(SERVICE_TYPE)) { 
       Log.d(TAG, "Unknown Service Type: " + service.getServiceType()); 
      } else if (service.getHost() == myIp) { 
       Log.d(TAG, "Same machine: " + service.getHost()); 
      } else if (service.getServiceName().contains(serviceName)){ 
       nsdManager.resolveService(service, resolveListener); 
      } 
     } 
    ... 
    } 
} 

Aber service.getHost() kehrt null.
Irgendwelche Vorschläge?

Antwort

13

Ich bin gerade über das gleiche Problem gestolpert und habe es mit ein wenig Hilfe von der Google-Seite zur Netzwerkerkennung gelöst.

http://developer.android.com/training/connect-devices-wirelessly/nsd.html

Das Problem ist, dass die Verbindungsinformationen nicht bekannt ist, wenn der Dienst entdeckt wird. Sie müssen es zuerst lösen, bevor getHost() funktioniert.

Sie haben bereits die Zeile:

nsdManager.resolveService(service, resolveListener); 

Die resolveListener Variable enthält Rückrufe für Erfolg und Misserfolg. Sie möchten getHost() verwenden, wenn die Verbindungsinformationen erfolgreich ermittelt wurden. Hier ist der Auflösungslistener von Google:

+0

Der Beispielcode in Android ist veraltet, sie sollten den Code nach Ihrer Codeänderung aktualisieren. : D – mxi1

+0

Leider funktioniert der resolveService (...) überhaupt nicht. Beim Empfang von .onServiceDiscovered() wird immer ein ".local" (per NsdManager!) Zum Protokolltyp hinzugefügt, wobei jedoch ".local" den Befehl resolveService() verwirrt. UNBEKANNTER FEHLER ist das Ergebnis. Wenn das .local entfernt wird, werden keine Aufrufe von dem (immer neuen Resolvelistener) in dem ersten Aufruf empfangen, während der zweite Aufruf Fehler NsdManager.FAILURE_ALREADY_ACTIVE: // = 3 gibt. Da es sich jedoch bei jedem Aufruf um eine neue Instanz handelt, ist dies bedeutungslos, es sei denn, es gibt einen Singleton-Mechanismus, der hier lauert. Tiefst nervige Unreife. – carl

+0

Ich kann hinzufügen, dass der Grund für das Ausführen mehrerer Auflösungsaufrufe einfach darin besteht, dass mehr als ein Dienst im lokalen Netzwerk erkannt wird. – carl