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?
Verschieben Sie jmdns.addServiceListener (... Codeblock von onPostExecute() zu doInBackground(), auch besser, Ihren Listener als inline anonyme Klasse zu erstellen. – yorkw