2012-03-27 12 views
1

Ich hatte einige Schwierigkeiten, JmDNS zu bekommen, um mit meinem Android AVD zu arbeiten. Ich habe 3 Anwendungen erstellt. Eine Android-Anwendung, die einen ServiceListener registriert und jede Aktivität protokolliert, eine Java-Anwendung, die dasselbe tut wie die Android-Anwendung, und eine andere Java-Anwendung, die einen Dienst registriert. Die Java-Listener-Anwendung greift die andere Java-Anwendung auf, die Android-Anwendung jedoch nicht. Ich habe auch versucht, zwei AVD gleichzeitig laufen zu lassen, um zu sehen, ob sie sich gegenseitig aufgreifen würden und sie nicht. Ich sollte auch erwähnen, dass ich Berechtigungen für INTERNET und CHANGE_WIFI_MULSTICAST_STATE aktiviert habe. Hier ist mein Code:Android AVD kann JmDNS Dienste nicht bemerken

Applikation für Android:

public class BonjourActivity extends Activity { 

    // Multicast 
    private WifiManager wifi; 
    private MulticastLock lock; 
    private JmDNS jmdns; 
    private String type = "_im._tcp.local."; 
    private ServiceListener listener; 
    private ServiceInfo serviceInfo; 

    // On Create 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // Multicast 
     wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
     lock = wifi.createMulticastLock(""); 
     lock.setReferenceCounted(true); 
     lock.acquire(); 

     // JmDNS 
     new AsyncTask<Object, Object, Object>(){ 
      @Override 
      protected Object doInBackground(Object... params) { 
       // Create JmDNS 
       try { 
        jmdns = JmDNS.create(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       return null; 
      } 
      protected void onPostExecute(Object result) { 
       // Add Listener 
       jmdns.addServiceListener(type, listener = new ServiceListener(){ 
         @Override 
         public void serviceAdded(ServiceEvent ev) { 
          jmdns.requestServiceInfo(ev.getType(), ev.getName(), 1); 
         } 
         @Override 
         public void serviceRemoved(ServiceEvent ev) { 
          Log.d("Service", "Service Removed: " + ev.getName()); 
         } 
         @Override 
         public void serviceResolved(ServiceEvent ev) { 
          Log.d("Service", "Service Resolved: " + ev.getInfo().getURL()); 
         } 
        }); 
      } 
     }.execute(); 
    } 

    // On Destroy 
    public void onDestroy(){ 
     // Release Lock 
     if (lock != null){ 
      lock.release(); 
     } 
     // Close JmDNS 
     if (jmdns != null){ 
      jmdns.removeServiceListener(type, listener); 
      try { 
       jmdns.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     super.onDestroy(); 
    } 
} 

Java Listener Anwendung:

public class Listener { 

    private static JmDNS jmdns; 
    private static String type = "_im._tcp.local."; 
    private static ServiceListener serviceListener; 
    private static ServiceInfo serviceInfo; 

    // Main 
    public static void main(String args[]){ 

     try { 
      jmdns = JmDNS.create(); 
      jmdns.addServiceListener(type, serviceListener = new ServiceListener(){ 
       @Override 
       public void serviceAdded(ServiceEvent ev) { 
        System.out.println("Service Added: " + ev.getName()); 
        jmdns.requestServiceInfo(ev.getType(), ev.getName(), 1); 
       } 
       @Override 
       public void serviceRemoved(ServiceEvent ev) { 
        System.out.println("Service Removed: " + ev.getName()); 
       } 
       @Override 
       public void serviceResolved(ServiceEvent ev) { 
        System.out.println("Service Resolved: " + ev.getInfo().getURL()); 
       } 
      }); 
      System.out.println("Listener Added"); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

} 

Java Sender Anwendung:

public class Sender { 

    private static JmDNS jmdns; 
    private static String type = "_im._tcp.local."; 
    private static ServiceListener serviceListener; 
    private static ServiceInfo serviceInfo; 

    // Main 
    public static void main(String args[]){ 

     try { 
      jmdns = JmDNS.create(); 
      serviceInfo = ServiceInfo.create(type, "Test IM Service", 55555, "Instant messaging test service"); 
      jmdns.registerService(serviceInfo); 
      System.out.println("Sender: Service Created"); 
      new Timer().schedule(new TimerTask(){ 
       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
        System.out.println("Closing.."); 
        jmdns.unregisterAllServices(); 
        try { 
         jmdns.close(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        System.exit(0); 
       } 
      }, 10000); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

} 

Außerdem gibt LogCat mir ein paar Fehler, wenn ich die Anwendung auszuführen versuchen:

NetworkManagementSocketTagger setKernelCountSet (10009,0) schlug fehl mit errno -2

WifiStateMachine Fehler! unbehandelte Nachricht {what = 131157 when = -1ms}

Könnte jemand wissen, warum die Android-Anwendung JMDNS-Dienste, die von anderen Anwendungen generiert wurden, nicht nutzen kann?

+0

Verschieben Sie jmdns.addServiceListener (... Codeblock von onPostExecute() zu doInBackground(), auch besser, Ihren Listener als inline anonyme Klasse zu erstellen. – yorkw

Antwort

1

Nur ein kleiner Hinweis, das virtuelle Gerät im Emulator läuft nicht im selben Netzwerk wie der Computer. Service Discovery funktioniert möglicherweise nicht. Meine Implementierung von jmdns funktioniert nicht im Emulator. Probieren Sie es auf einem echten Gerät aus. Und gehen Sie zu http://home.heeere.com/tech-androidjmdns.html für weitere Details.