Ich versuche Bonjour/Zero Conf auf meiner Android-App zu implementieren. Ich benutze jmDns-Bibliothek für die Suche nach allen verfügbaren Geräten. Hier ist der Code, den ich für die Suche, die Geräte im gleichen Netzwerk bin mit:Bonjour Implementierung auf Android
public class ListDevices extends ListActivity {
JmDNS jmdns;
JmDNSImpl impl;
MulticastLock lock;
protected ServiceListener listener;
protected ServiceInfo info;
public ListView lv;
public ArrayList<String> deviceList;
public int cancel = 0;
public final static String TAG = "ListDevices";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
deviceList = new ArrayList<String>();
showAllPrinters();
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, deviceList));
lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// When clicked, show a toast with the TextView text
Toast.makeText(getApplicationContext(),
((TextView) view).getText(), Toast.LENGTH_SHORT).show();
}
});
this.listener = new ServiceListener() {
public void serviceAdded(ServiceEvent event) {
deviceList.add("Service added : " + event.getName() + "."
+ event.getType());
Log.v(TAG, "Service added : " + event.getName() + "."
+ event.getType());
}
public void serviceRemoved(ServiceEvent event) {
deviceList.add("Service removed : " + event.getName() + "."
+ event.getType());
Log.v(TAG, "Service removed : " + event.getName() + "."
+ event.getType());
}
public void serviceResolved(ServiceEvent event) {
deviceList.add("Service resolved: " + event.getInfo());
Log.v(TAG, "Service resolved: " + event.getInfo());
}
};
}
public void showAllPrinters() {
Log.d("ListDevices", "in showAllPrinters");
try {
WifiManager wifi = (WifiManager)
getSystemService(Context.WIFI_SERVICE);
lock = wifi.createMulticastLock("fliing_lock");
lock.setReferenceCounted(true);
lock.acquire();
InetAddress inetAddress = getLocalIpAddress();
jmdns = JmDNS.create(inetAddress, "TEST");
ServiceInfo[] infos = jmdns.list("_http._tcp.local.");
if (infos != null && infos.length > 0) {
for (int i = 0; i < infos.length; i++) {
deviceList.add(infos[i].getName());
}
} else {
deviceList.add("No device found.");
}
impl = (JmDNSImpl) jmdns;
} catch (IOException e) {
e.printStackTrace();
}
}
public InetAddress getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface
.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = (NetworkInterface) en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf
.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = (InetAddress) enumIpAddr
.nextElement();
if (!inetAddress.isLoopbackAddress()) {
return inetAddress;
}
}
}
} catch (SocketException ex) {
Log.e("ListDevices", ex.toString());
}
return null;
}
@Override
protected void onPause() {
super.onPause();
if (isFinishing()) {
lock.release();
}
}
}
Grundsätzlich ich sie in einer Liste bin hinzugefügt, so dass ich eine Liste aller verfügbaren Geräte anzeigen kann. Jetzt, wenn ich diesen Code ausführe, bekomme ich keine Ausnahme/nichts wie Fehler. Aber auf der anderen Seite wird meiner Liste nichts hinzugefügt [PS: dort sind mindestens 5-6 PCs und Macs im Netzwerk vorhanden.
Ich habe auch versucht die Liste von diesem Code zu erhalten:
jmdns.addServiceListener("_http._tcp.local.", listener);
listener
im onCreate
der Aktivität definiert ist. Aber das hat auch kein Gerät zurückgegeben.
Bitte helfen Sie, schlagen Sie vor, was ich hier falsch mache. Jede Hilfe wird geschätzt!
Sollten Sie diesen Code nicht verwenden: if (! InetAddress.isLoopbackAddress() &&! InetAddress.isLinkLocalAddress() && inetAddress.isSiteLocalAddress()) – Radu
@mudit.Ich verstehe, dass einige Zeit vergangen ist, seit du auf dieses Problem gestoßen bist. Haben Sie versucht, mit "_http._tcp" anstatt mit "_http._tcp.local." Aufzulisten. Ich kann nicht erklären warum, aber es macht einen Unterschied in meinem Fall. Bisher macht es nur bei Verwendung von NsdManager (Standard Android Discovery) einen Unterschied. Ich werde wissen, wie es JmDNS Lookup später beeinflussen könnte, sobald unser Benutzer mit dem Problem es versuchen wird ... – vladimir