Bluetoothペアリングにトライ!

アプリ内でペアリングしたい!

 androidとPCで同期をとれるアプリを作成中なう。
一応ほぼ実装完了したので細かい部分(ペアリング設定とか)をやりたいなと思いました。.....しかし!ペアリングは思った以上に難解ですよみなさん!(ペアリング以外もBluetooth関係は何かと訳分かりませんが…)


 そもそも近年の?androidではアプリで勝手にペアリングすることはセキュリティ的にあまりよくないと考えられているようで、ペアリング用?のメソッドたちも隠蔽されて基本的に利用出来なくなっているようです(createBondやsetPinなど)。
android developer を見てみると、ペアリングされていないデバイスに接続しようとすると勝手にペアリングが始まるみたいなことが書いてあります。.....が私が試したところ、ただただ接続エラーが出るだけでしたorz 多分android同士だとうまくいくんでしょうな


では他のアプリはどうなっているかというと…
 PCとファイルのやりとりが出来るアプリ「Bluetooth File Transfer」の場合、普通にアプリ内でペアリング出来ました(笑) なぜだー!!?


ググった末たどり着いたのはリフレクション?を使う方法。たとえば以下のような感じ

リフレクションを使えば createBond 等を実現可能

// BluetoothデバイスをMACアドレスから取得
BluetoothDevice device = btAdapter.getRemoteDevice(btMacAddress);

// ペアリング開始処理呼び出し
Method createBond = device.getClass().getMethod("createBond", new Class[] {});
Boolean res = (Boolean)createBond.invoke(device);

リフレクションってすげー!


 ということでリフレクションを使う方法でいろいろ試してみたんですが、ペアリングの手順とか仕組みとかもう分からんわーー! そもそも createBond 呼び出したらどこからともなく通知バーに通知が現れて、まあその通知を使えば一応ペアリング出来たのは出来たんですがなんでそもそも通知なのか、普通にアプリ上にダイアログで表示させてくれないのか とかいろいろ意味不明だったので.....あきらめました!ガッデム!!


ペアリングに関してはユーザに丸投げし、ペアリングしたいときは設定画面を呼び出してもらうようにしました…

Bluetooth設定画面呼び出し方法

Intent intent = new Intent();
intent.setAction(android.provider.Settings.ACTION_BLUETOOTH_SETTINGS);
startActivity(intent);   


あとは自分で勝手にペアリングしてくれと!!
くやしいのー