Android 4.3 以降で利用できる Bluetooth Low Energy(BLE)では、デバイス間での短時間の接続を複数作成することで、膨大な量のデータ転送を実現します。接続されていないときにはスリープモードが維持されることで、クラシック Bluetooth に比べて低い帯域幅を提供し、消費電力を抑制します。 BLE は、心拍数モニターやワイヤレス キーボードなどのアプリに最適です。使用するには、BLE 対応のチップセットをデバイスに搭載する必要があります。
実装
現在の BLE アプリ プロファイルは、すべて Generic Attribute Profile(GATT)をベースにしています。Android デバイスが BLE デバイスと通信するとき、情報を送信するデバイスがサーバーになり、情報を受信するデバイスがクライアントになります。Android には、BLE 用のデベロッパー API が用意されており、GATT サーバーと GATT クライアントとの間で通信を行う API も含まれています。BLE API を最大限に活用するには、Android Bluetooth の HCI 要件を実装してください。
デバイスのモード
BLE を使用する場合、Android デバイスはペリフェラル デバイスかセントラル デバイス、またはその両方として動作します。ペリフェラル モードでは、デバイスはアドバタイズメント パケットを送信できます。セントラル モードでは、デバイスはアドバタイズメントをスキャンできます。ペリフェラル デバイスとセントラル デバイスの両方として動作する Android デバイスは、ペリフェラル モードでアドバタイズメントを送信しながら、他の BLE ペリフェラル デバイスと通信できます。Bluetooth 4.1 以前に対応するデバイスは、セントラル モードでのみ BLE を使用できます。古いデバイス チップセットでは、BLE のペリフェラル モードに対応していない場合があります。
BLE スキャン
BLE を使用する Android デバイスは、特定の Bluetooth デバイスをより効率的にターゲットにしてスキャンできます。アプリのデベロッパーは、BLE API を使用して、ホスト コントローラからの関与が少ないデバイスを見つけるためのフィルタを作成できます。
位置情報のスキャン
デバイスの位置情報サービスは、Bluetooth を使用して Bluetooth ビーコンを検出することで、より正確な位置情報を提供できます。ユーザーがこの機能を有効にする方法は以下のとおりです。
- [設定] > [セキュリティと現在地情報] > [位置情報] に移動します。
- 位置情報の [ON]/[OFF] の切り替えが [ON] になっていることを確認します。
- [モード] に移動します。
- [高精度] または [バッテリー節約] のいずれかのモードを選択します。
Android 11 以前では、個々のアプリが接続するデバイスを見つけるためだけにスキャンする場合でも、BLE スキャンを使用するには位置情報の利用許可が必要です。ユーザーが位置情報のスキャンを無効にした場合や、アプリに位置情報の利用許可を付与しなかった場合、アプリは BLE スキャン結果を受け取れません。
Android 12 以降では、BLUETOOTH_SCAN
、BLUETOOTH_ADVERTISE
、BLUETOOTH_CONNECT
の権限により、アプリは位置情報の利用許可をリクエストすることなく付近のデバイスをスキャンできます。
詳細については、Android 12 の新しい Bluetooth 権限をご覧ください。
ユーザーは、システムレベルでの Bluetooth のバックグラウンド スキャンを無効にできます。これを行うには、[設定] > [セキュリティと現在地情報] > [位置情報] > [スキャン] に移動して、[Bluetooth のスキャン] を無効に切り替えます。この設定は、位置情報またはローカル デバイスの BLE スキャンには影響しません。
スキャン結果をフィルタする
Android 6.0 以降では、Bluetooth コントローラで BLE スキャンとフィルタ マッチングを実行できます。デバイスでスキャン結果をフィルタして、BLE デバイスに関連する found イベントと lost イベントをアプリ プロセッサ(AP)にレポートできます。また、フィルタリングは一括スキャンでも機能します。その場合、BLE スキャンがファームウェアにオフロードされるため、電力を節約できます。一括スキャンは、デバイスまたはビーコンの BLE スキャンにより、AP がスリープ状態から起動する頻度を減らします。
Bluetooth コントローラには OnFound
/OnLost
機能が実装されており、BLE デバイスがスキャンの対象から外れていないことを確認するテストが行えます。これによって電力が節約され、以下の利点も得られます。
OnFound
イベントの場合、特定のデバイスが検出されるとメイン AP がスリープモードから復帰します。OnLost
イベントの場合、特定のデバイスが見つからないと AP がスリープモードから復帰します。- フレームワーク アプリでは、隣接するデバイスが範囲内にある場合、不要な通知が削減されます。
- 連続でスキャンを行うことで、デバイスが範囲外にあるとフレームワーク アプリに通知するようにできます。
スキャン フィルタは、デバイスのアドバタイズメントの検出(OnFound
イベント)に基づいて設定できます。Java レイヤでは、最初の検出(最初の検出以降の指定された数のアドバタイズメント)などのパラメータを指定できます。BLE フィルタリングを実装するには、アドバタイジング パケット コンテンツ フィルタ HCI コマンドを使用します。