結局ソースコードをプロジェクトに加えた

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);
}