結局ソースコードをプロジェクトに加えた
Stack Overflow を彷徨っている時に誰かが「jmdns のソースコードをプロジェクトにぶちこんで動かした。」ってのを読んだ気がしたので、自分でもそれをやってみた。
まずは Mavencentral repo から jmdns-3.4.1-sources.jar をダウンロードしてソースコードを展開。
iMac-i3-27:~ paraches$ jar xf jmdns-3.4.1-sources.jar
で、これを動作確認用のプロジェクトに読み込んだ。
(この読み込み手順も良くわからなくて、結局 eclipse のエラーメッセージに1つづつ答えてなんとか形になった…)
最終的にプロジェクトはこんな感じに。
こんなんで良いのかな?と思ったけど、アプリを起動しても今度は落ちなくなった!
というわけで、実際に CentOS で稼働している mt-daapd(Firefly) を見つけるのに type を _daap._tcp.local. にして起動してみると…
ちゃんと見つけられた!
あ、コードはこんな感じ。
これは AndroidDnssdDemo のコードをほぼそのまま流用した。
private String type = "_daap._tcp.local."; private JmDNS jmdns = null; private ServiceListener listener = null; private ServiceInfo serviceInfo; private void setUp() { android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) getSystemService(android.content.Context.WIFI_SERVICE); lock = wifi.createMulticastLock("mylockthereturn"); lock.setReferenceCounted(true); lock.acquire(); try { jmdns = JmDNS.create(); jmdns.addServiceListener(type, listener = new ServiceListener() { @Override public void serviceResolved(ServiceEvent ev) { notifyUser("Service resolved: " + ev.getInfo().getQualifiedName() + " port:" + ev.getInfo().getPort()); } @Override public void serviceRemoved(ServiceEvent ev) { notifyUser("Service removed: " + ev.getName()); } @Override public void serviceAdded(ServiceEvent event) { // Required to force serviceResolved to be called again (after the first search) jmdns.requestServiceInfo(event.getType(), event.getName(), 1); } }); serviceInfo = ServiceInfo.create("_test._tcp.local.", "AndroidTest", 0, "plain test service from android"); jmdns.registerService(serviceInfo); } catch (IOException e) { e.printStackTrace(); return; } } private void notifyUser(final String msg) { handler.postDelayed(new Runnable() { public void run() { TextView t = (TextView)findViewById(R.id.test); t.setText(msg+"\n=== "+t.getText()); } }, 1); }