【Kotlin/Android Studio】Bluetoothのスキャン方法!startScanの使い方
この記事からわかること
- Android Studio/KotlinでBluetooth接続アプリの実装方法
- startScanメソッドの使い方
- スキャンにフィルタリングや設定をする方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
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)
他の設定は公式リファレンスを参考にしてください。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。