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

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

AndroidアプリでBLE機能を実装しようとすると、OSのバージョンや機種依存、ハマりやすいポイント等があったりと結構クセが強いです。
NordicのAndroid用BLEライブラリはその辺りを良い感じに吸収してくれています。
  1. Android-Scanner-Compat-Library
  2. Android-BLE-Library
今回は Android-Scanner-Compat-Library を実装例と共に紹介します。

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

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

一番簡単な使用例:
val scanCallBack = object : ScanCallback() {
    override fun onScanResult(callbackType: Int, result: ScanResult) {
        Log.d("TAG", result.device.toString())
    }

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

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

//  スキャン停止
BluetoothLeScannerCompat.getScanner().stopScan(scanCallback)
この BluetoothLeScannerCompatクラス を使用するだけで以下のメリットがあります。
  • 古いバージョンのOS(7以下)でも可能な限り同じ動作をしてくれる
  • バックグラウンドでも良い感じに動作してくれる
逆にいうと、動作条件が
  • Android 8以上
  • フォアグランドのみ使用
であるならばあまり使用するメリットはありません。
少しコード量が減るくらいです。

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

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