Android-Scanner-Compat-Library

こんにちは、アプリケーションエンジニアの難波です。

BraveridgeではIoTデバイスを製作する時によくNordic社のSoCを使用しています。
そのNordic社はAndroid用のBluetooth® LE ライブラリをOSSとしてリリースしています。

AndroidアプリでBluetooth® LE 機能を実装しようとすると、OSのバージョンや機種依存、ハマりやすいポイント等があったりと結構クセが強いです。
NordicのAndroid用Bluetooth® LE ライブラリはその辺りを良い感じに吸収してくれています。

  1. Android-Scanner-Compat-Library
  2. Android-BLE-Library

今回は Android-Scanner-Compat-Library を実装例と共に紹介します。

実装例

Centralを実装する時にBluetooth® LE デバイスのスキャン Bluetooth® LE デバイスに接続して制御 という2機能を実装する必要があります。
このライブラリはBluetooth® LE デバイスのスキャン を担当します。

使用方法は簡単というか、単に BluetoothLeScannerクラス を BluetoothLeScannerCompatクラス に置き換えれば使用できます。
一番簡単な使用例:


val scanCallBack = object : ScanCallback() {
    override fun onScanResult(callbackType: Int, result: ScanResult) {
        Log.d("TAG", result.device.toString())
    }

    override fun onBatchScanResults(results: List) {
        results.forEach { 
            Log.d("TAG", it.device.toString())
        }
    }
}

//  スキャン開始
BluetoothLeScannerCompat.getScanner().startScan(scanCallBack)

//  スキャン停止
BluetoothLeScannerCompat.getScanner().stopScan(scanCallback)


メリット

この BluetoothLeScannerCompatクラス を使用するだけで以下のメリットがあります。

  • 古いバージョンのOS(7以下)でも可能な限り同じ動作をしてくれる
  • バックグラウンドでも良い感じに動作してくれる

逆にいうと、動作条件が

  • Android 8以上
  • フォアグランドのみ使用

であるならばあまり使用するメリットはありません。
少しコード量が減るくらいです。

バックグラウンドでも動作させるには

なお、バックグラウンドでも(アプリがkillされても)Bluetooth® LE スキャンを動作させたい場合、READMEにあるように BroadcastReceiver を実装して startScan() と stopScan() をコールする時に PendingIntent を渡せばOKです。
とても簡単ですね。

サンプルアプリを含めたソースコード全体は github で確認できます。

SNS SHARE