Android – jmdns entdeckt keine Geräte

Ich versuche, eine Klasse zu implementieren, um Dienste im Netzwerk zu entdecken. Ich habe versucht, mit Android NSD zu arbeiten und es entdeckt die Dienste gut, aber es unterstützt nur API Level 16 und up, und ich kann nicht scheinen, das txtRecord Feld innerhalb der Service-Info abzurufen (es gibt null aus irgendeinem Grund zurück). Stellt sich heraus, dass es ein bekanntes Problem ist …

Also jetzt versuche ich, mit jMDns zu arbeiten, was scheint, überhaupt keine Dienste zu finden. Hier ist meine Klasse (ich arbeite mit dem AndroidAnnotations-Framework) MDnsHelper:

@EBean public class MDnsHelper implements ServiceListener { public static final String SERVICE_TYPE = "_http._tcp.local"; Activity activity; private JmDNS jmdns; private MulticastLock multicastLock; WifiManager wm; InetAddress bindingAddress; boolean isDiscovering; public void init(Activity activity) { this.activity = activity; isDiscovering = false; wm = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE); multicastLock = wm.createMulticastLock(activity.getPackageName()); multicastLock.setReferenceCounted(false); } @Background public void startDiscovery() { if (isDiscovering) return; System.out.println("starting..."); multicastLock.acquire(); try { System.out.println("creating jmdns"); jmdns = JmDNS.create(); System.out.println("jmdns created"); } catch (IOException e) { e.printStackTrace(); } finally { if (jmdns != null) { jmdns.addServiceListener(SERVICE_TYPE, MDnsHelper.this); isDiscovering = true; System.out.println("discovering services of type: " + SERVICE_TYPE); } } } @Background public void stopDiscovery() { if (!isDiscovering || jmdns == null) return; System.out.println("stopping..."); multicastLock.release(); jmdns.removeServiceListener(SERVICE_TYPE, MDnsHelper.this); System.out.println("listener for " + SERVICE_TYPE + " removed"); try { jmdns.close(); isDiscovering = false; System.out.println("jmdns closed"); } catch (IOException e) { e.printStackTrace(); } } @Override public void serviceAdded(ServiceEvent service) { System.out.println("found: " + service.getInfo().toString()); } @Override public void serviceRemoved(ServiceEvent service) { System.out.println("lost: " + service.getInfo().toString()); } @Override public void serviceResolved(ServiceEvent service) { System.out.println("resolved: " + service.getInfo().toString()); } } 

Und in meiner App rufe ich an:

 init(getActivity()); 

Und dann startDiscovery(); Zum Scannen starten und stopDiscovery(); Das Scannen beenden.

Und natürlich habe ich der App die nötigen Berechtigungen im Manifest gegeben … Was fehlt mir hier? Wenn du mich brauchst, um zusätzlichen Code / Info zur Verfügung zu stellen – einfach fragen. Vielen Dank!!

  • Wie kann ich einen Booleschen Wert mit SharedPreferences in Android speichern?
  • Wie kann ich die Sprache meiner Bewerbung ändern?
  • Wie finde ich Tablet oder Telefon in Android, programmgesteuert?
  • App stürzt beim Start auf Android API 10 aber nicht auf API 16 wegen der Ressourcen $ NotFoundException
  • Wie kann ich eine bestehende Regel programmgesteuert entfernen, die in XML definiert wurde?
  • Android MediaPlayer-Reset setzt die Benutzeroberfläche ein
  • One Solution collect form web for “Android – jmdns entdeckt keine Geräte”

    Ich bin der Autor von ZeroConf Browser für Android und ich benutze die Open Source Bibliothek JmDNS für alle meine Auflösung. Es funktioniert super, aber es gibt ein paar Tricks, um es richtig zu funktionieren.

    1. In Ihrem Android Manifest.xml stellen Sie sicher, dass Sie diese Berechtigungen mindestens haben.

       <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 
    2. Bevor Sie die Aktivität starten, müssen Sie Multi-Cast-Pakete durch Erwerb einer Multicast-Sperre zulassen.

       @Override protected void onStart() { Log.i(TAG, "Starting ServiceActivity..."); super.onStart(); try { Log.i(TAG, "Starting Mutlicast Lock..."); WifiManager wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); // get the device ip address final InetAddress deviceIpAddress = getDeviceIpAddress(wifi); multicastLock = wifi.createMulticastLock(getClass().getName()); multicastLock.setReferenceCounted(true); multicastLock.acquire(); Log.i(TAG, "Starting ZeroConf probe...."); jmdns = JmDNS.create(deviceIpAddress, HOSTNAME); jmdns.addServiceTypeListener(this); } catch (IOException ex) { Log.e(TAG, ex.getMessage(), ex); } Log.i(TAG, "Started ZeroConf probe...."); } 
    3. Und vergessen Sie nicht, den Scan zu stoppen, um die Multicast-Sperre freizuschalten und JmDNS herunterzufahren.

       @Override protected void onStop() { Log.i(TAG, "Stopping ServiceActivity..."); super.onStop(); stopScan(); } private static void stopScan() { try { if (jmdns != null) { Log.i(TAG, "Stopping ZeroConf probe...."); jmdns.unregisterAllServices(); jmdns.close(); jmdns = null; } if (multicastLock != null) { Log.i(TAG, "Releasing Mutlicast Lock..."); multicastLock.release(); multicastLock = null; } } catch (Exception ex) { Log.e(TAG, ex.getMessage(), ex); } } 
    4. Wichtigster ist nicht der Standardkonstruktor. Sie müssen den IP-Adressenkonstruktor verwenden. Ich habe in deinem Code bemerkt du machst einfach nur JmDNS.create (). Ich denke aus irgendeinem Grund die einzige Art, wie es funktioniert auf Android ist es, den Trainer unten zu verwenden.

       jmdns = JmDNS.create(deviceIpAddress, HOSTNAME); 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.