2014年8月18日月曜日

LG G Watchに(母艦以外と)Bluetoothで接続する


LG G WatchにBluetooth(SPP)で接続してみました。
実現可能なのはわかりきっていたのですが、あんまり試してみる人も少ないだろうなーと思いやってみました。ポイントだけ説明していきます。
ちなみに、Android Wearと母艦となるAndroidで通信するアプリを作る場合、Wear用のAPIを使うことが推奨されています。(Bluetoothで直接通信するなとドキュメントに書かれていた気がします)


ペアリング


Android Wearの設定画面にはBluetoothの設定項目が無いため、一般的なAndroidのように設定画面からBluetoothのペアリングを行うことはできません。ペアリング用の画面を自作する必要があります。

他端末から腕輪をペアリングする

Android端末をLG G Watchとペアリングしたい時はこの方法が簡単だと思います。手順は以下の3つ

  1. LG G Watchを検出可能状態にする
  2. 接続したい端末の設定->Bluetoothからデバイスの検出を実行し、リストに表示されたLG G Watchを選択しペアリングを行う
  3. LG G Watchにペアリング要求画面が出るので承認

非常に簡単に思えたのですが、どうやら検出可能状態にするためのActivity(RequestPermissionActivity)がAndroid Wearには存在しないようです。検出可能にしてもよいかユーザに確認するDialogを出すためのActivityなので、画面の大きさ関係でDialogが使いにくいAndroid Wearで省略されていても納得できるといえば納得できます。
仕方ないのでRequestPermissionActivityのソースコードを追ったところ、BluetoothAdapter#setScanModeを使用すれば検出可能状態にできることがわかりました。非公開APIなのでリフレクションを使う必要があります。
また、ペアリング要求をされた後の画面はAndroid Wearに用意されており、勝手に立ち上がるのでアプリで何か用意する必要はありません。セットアップの時に出てくるあれです。

LG G Watchからペアリングを行う

Bluetooth機器に接続する場合はこの方法が必要になります。やることは2つ。
  1. 接続可能なBluetooth機器をサーチしリストに表示
  2. 接続したいBluetooth機器を選択し、ペアリング要求を開始
ペアリング要求を行うためのAPIは非公開APIだったなー。またリフレクションか。。と思ったらAPI Level 19で公開されていました。BluetoothDevice#createBondなどを使えばペアリングできます。

接続

API GuidesのBluetooth->Connecting Devicesに書かれている接続方法に沿って接続します。

LG G Watchをクライアントとして接続

ペアリング済みデバイス一覧を表示して、その中から繋ぎたいものを選択できるようにすればいいでしょう。普通に接続できますが、複数台接続していないので接続限度数等はわかりません。

LG G Watchをサーバとして接続

少し癖がありました。息切れしてきたので簡潔に書くと

  • LG G Watchが母艦のAndroidと接続している時は、LG G Watchをサーバとして他のBluetooth機器と接続できない
  • LG G Watchが母艦のAndroid端末と接続していない時は、LG G Watchをサーバとして他のBluetooth機器と接続出来る
  • LG G Watchをサーバとして他のBluetooth機器と接続中に、母艦のAndroidと接続できる


最後に

やることが多いので中々疲れました。ペアリング部分はWear用のBluetooth設定画面としてリリースするつもりで夏休み宿題的に作っていたんですが夏休み終わっちゃいました。