【Kotlin/Android】Bluetoothのペアリング(ボンディング)を行う方法!createBond

この記事からわかること
- Android Studio/KotlinでBluetooth接続アプリの実装方法
- Central側の実装
- ペアリング(ボンディング)するには?
- createBondメソッドの使い方
- ACTION_BOND_STATE_CHANGEでボンディング状態の変化を検知する
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Koala
- Kotlin:1.9.0
ペアリングとは?
例えばBluetoothイヤホンなどを使用する際に初回にBluetooth接続(ペアリング)を行えば次回からは自動で接続される経験があると思います。これは両方の機器がお互いを登録し合っているために2回目以降のペアリング作業を省略できるようになっています。
Bluetooth機器を使用しているとよく聞く「ペアリング」という言葉ですがこれはセントラルとペリフェラル間のデータ暗号化のための鍵の交換をすること自体を指します。一般的にはペアリングが機器同時の接続のようなニュアンスですが厳密にみると少し異なるので注意してください。
ボンディングとは?
一度ペアリング(鍵を交換)した機器がペアリングなしに接続できるようになるのは交換した鍵をキャッシュしているからです。そしてこの「暗号鍵をキャッシュしておき再度同じ相手と接続するときに、ペアリングを省略できる機能」のことを「ボンディング」と呼びます。
Androidアプリでボンディングする方法
記事タイトルにはあえてペアリングと書きましたがボンディングする方法をまとめていきます。(ペアリングは接続時に自動で行われるので特に触れません)
またセントラル側の実装は前回の記事を参考にしてください。この続きで今回は進めていきます。
前回の記事ではデバイスアドレスをローカルに保存することで再度ペアリングしなくても接続できるように実装していました。ただこれはボンディング機能を実装することでローカル保存処理を不要にすることができます。
実装はGitHubに公開しているので参考にしてください。
createBondメソッド
実際にボンディングを行うにはBluetoothDevice#createBondメソッド
を使用します。
サンプルコードではスキャン処理を実行して対象のペリフェラルを検出した際になどに呼び出しています。
createBond
を実行すると端末上にペアリングを許可するかどうかのポップアップが表示されます。ここで「ペア設定する」を選択することでボンディングが完了します。

ボンディングが完了するとAndroid端末の「設定アプリ」>「接続設定」>「保存済みのデバイス」にボンディングしているデバイス情報が表示されるようになります。ここから接続やボンディング情報の削除を行うことができるようになっています。

ボンディングしているデバイスと接続する
ボンディングしただけでは接続はできていないのでボンディングしているデバイスと接続する処理を実装していきます。端末でボンディングしている機器情報はBluetoothAdapter#bondedDevices
からリストで取得することが可能です。この中には他にボンディングしている機器の情報もあるのでアプリ内で使用するにはデバイス名などでフィルタリングをかけて対象のBluetoothDevice
を取得します。
デバイス情報が取得できれば接続処理が実行できるようになります。
ボンディング状態を識別する
BluetoothDevice
がボンディング済みかどうかはbondState
プロパティから識別することができます。取得できる値はint
型になっているのでBluetoothDevice
に定義されている定数と照らし合わせて状態を確認します。
ボンディング状態の変化を検知する
ボンディングリクエストを行いポップアップが表示された際に「ペア設定をする」と「キャンセル」が選択できるようになっており、その後のボンディング状態の変化を検知することが可能です。
公式リファレンス:BluetoothDevice#ACTION_BOND_STATE_CHANGED
BluetoothDevice#ACTION_BOND_STATE_CHANGED
というBroadcast Actionが用意されているのでこれを使用すれば検知できました。
結果はBroadcastReceiver
型のオブジェクトを作成して受け取ります。
他にもペアリングをリクエストしたことを検知するACTION_PAIRING_REQUEST
などがあります。詳細は公式を参考にしてください。
コードからボンディング情報を削除する
ボンディング情報を削除するためのメソッドとしてBluetoothDevice#removeBond
がありますがこちらはprivate
で定義されているため開発者が呼び出して使用することは想定されていません。そのためコードからボンディング情報を削除することは不可能になっているようです。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。