BLE デバイスを見つけるには、startScan()
メソッドを使用します。このメソッドはパラメータとして ScanCallback
を受け取ります。このコールバックによってスキャン結果が返されるため、このコールバックを実装する必要があります。スキャンはバッテリーを大量に消費するため、次のガイドラインを守ってください。
- 目的のデバイスが見つかったら、すぐにスキャンを停止します。
- ループスキャンは絶対に行わないでください。また、スキャンには必ず時間制限を設定します。以前は利用可能だったデバイスが範囲外に移動し、スキャンが続くとバッテリーが消耗する可能性があります。
次の例の BLE アプリは、利用可能な Bluetooth LE デバイスをスキャンし、ユーザーに表示するアクティビティ(DeviceScanActivity
)を提供します。次のスニペットは、スキャンの開始と停止の方法を示しています。
Kotlin
private val bluetoothLeScanner = bluetoothAdapter.bluetoothLeScanner private var scanning = false private val handler = Handler() // Stops scanning after 10 seconds. private val SCAN_PERIOD: Long = 10000 private fun scanLeDevice() { if (!scanning) { // Stops scanning after a pre-defined scan period. handler.postDelayed({ scanning = false bluetoothLeScanner.stopScan(leScanCallback) }, SCAN_PERIOD) scanning = true bluetoothLeScanner.startScan(leScanCallback) } else { scanning = false bluetoothLeScanner.stopScan(leScanCallback) } }
Java
private BluetoothLeScanner bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner(); private boolean scanning; private Handler handler = new Handler(); // Stops scanning after 10 seconds. private static final long SCAN_PERIOD = 10000; private void scanLeDevice() { if (!scanning) { // Stops scanning after a predefined scan period. handler.postDelayed(new Runnable() { @Override public void run() { scanning = false; bluetoothLeScanner.stopScan(leScanCallback); } }, SCAN_PERIOD); scanning = true; bluetoothLeScanner.startScan(leScanCallback); } else { scanning = false; bluetoothLeScanner.stopScan(leScanCallback); } }
特定の種類の周辺機器のみをスキャンするには、代わりに startScan(List<ScanFilter>, ScanSettings, ScanCallback)
を呼び出して、スキャンの対象デバイスを制限する ScanFilter
オブジェクトのリストと、スキャンに関するパラメータを指定する ScanSettings
オブジェクトを指定します。
次のコードサンプルは、BLE スキャン結果を提供するために使用されるインターフェースである ScanCallback
の実装です。結果が見つかると、DeviceScanActivity
のリスト アダプターに追加され、ユーザーに表示されます。
Kotlin
private val leDeviceListAdapter = LeDeviceListAdapter() // Device scan callback. private val leScanCallback: ScanCallback = object : ScanCallback() { override fun onScanResult(callbackType: Int, result: ScanResult) { super.onScanResult(callbackType, result) leDeviceListAdapter.addDevice(result.device) leDeviceListAdapter.notifyDataSetChanged() } }
Java
private LeDeviceListAdapter leDeviceListAdapter = new LeDeviceListAdapter(); // Device scan callback. private ScanCallback leScanCallback = new ScanCallback() { @Override public void onScanResult(int callbackType, ScanResult result) { super.onScanResult(callbackType, result); leDeviceListAdapter.addDevice(result.getDevice()); leDeviceListAdapter.notifyDataSetChanged(); } };