【Kotlin/Android Studio】Bluetoothのスキャン方法!startScanの使い方

この記事からわかること

  • Android Studio/KotlinBluetooth接続アプリ実装方法
  • startScanメソッド使い方
  • スキャンフィルタリング設定をする方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

公式リファレンス:BluetoothLeScanner

環境

Bluetoothのスキャン方法

KotlinでBluetooth機能の実装の流れのペリフェラルのスキャンを実装するためにはbluetoothLeScannerクラスのstartScanメソッドを実行します。bluetoothLeScannerクラスを取得するためにはBluetoothAdapterクラスが必要になります。


private val bluetoothAdapter: BluetoothAdapter? by lazy(LazyThreadSafetyMode.NONE) {
    val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
    bluetoothManager.adapter
}

startScanメソッドの引数にはスキャンの結果後に処理を行うためのコールバックをScanCallback型で定義する必要があります。


bluetoothLeScanner = bluetoothAdapter?.bluetoothLeScanner
scanCallback = leScanCallback()
// スキャンの開始
bluetoothLeScanner?.startScan(scanCallback)

ScanCallback内でonScanResultメソッドの中でスキャンしたペリフェラル情報を取得することが可能です。

private fun leScanCallback(): ScanCallback? {
    return object: ScanCallback() {
        override fun onScanResult(
            callbackType: Int,
            result: ScanResult,
        ) {
            super.onScanResult(callbackType, result)

            if (result != null && result.device != null && result.device.name?.toString() == "対象Peripheral名") {
                // 所望のペリフェラルが見つかった。
                // スキャンの停止
                bluetoothLeScanner?.stopScan(scanCallback)
            }
            return
        }
    }
}

スキャンのフィルタリング方法

startScanメソッドは引数にScanFilter型のリストを渡すことでデバイス名やサービスUUIDでスキャンを絞り込むことができます。setDeviceNameメソッドに絞り込みたいデバイス名をsetServiceUuidメソッドにはParcelUuid型でUUIDを渡します。

var serviceUuid = UUID.fromString("00000000-1111-1111-1111-111111111111")
  
var scanNameFilter: ScanFilter = ScanFilter.Builder()
    .setDeviceName("デバイス名")
    .build()

var scanUuidFilter: ScanFilter = ScanFilter.Builder()
    .setServiceUuid(ParcelUuid(serviceUuid))
    .build()

var scanFilters = ArrayList<ScanFilter>()
scanFilters.add(scanNameFilter)
scanFilters.add(scanUuidFilter)

bluetoothLeScanner?.startScan(scanFilters, scanCallback)

スキャン設定を指定する

startScanメソッドの引数にScanSettings型の値を渡すことでスキャン時の設定を指定することができます。例えばSCAN_MODE_BALANCEDを指定することで検出効率とエネルギー消費の適度なバランスを維持したスキャンにすることが可能です。

 var scanSettings: ScanSettings = ScanSettings.Builder()
    .setScanMode(ScanSettings.SCAN_MODE_BALANCED)
    .build()
  
bluetoothLeScanner?.startScan(scanFilters, scanSettings, scanCallback)

他の設定は公式リファレンスを参考にしてください。

公式リファレンス:ScanSettings

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index