Per trovare i dispositivi BLE, utilizza il metodo startScan()
. Questo metodo prevede ScanCallback
come parametro.
Devi implementare questo callback, perché è così che vengono restituiti i risultati della scansione.
Poiché la scansione consuma molta batteria, devi attenerti alle seguenti linee guida:
- Non appena trovi il dispositivo desiderato, interrompi la scansione.
- Non eseguire mai la scansione in loop e imposta sempre un limite di tempo per la scansione. Un dispositivo precedentemente disponibile potrebbe essere stato spostato fuori dal raggio d'azione e, se continui a eseguire la scansione, la batteria scarica.
Nell'esempio seguente, l'app BLE fornisce un'attività (DeviceScanActivity
) per cercare i dispositivi Bluetooth LE disponibili e mostrarli in un elenco all'utente. Lo snippet seguente mostra come avviare e interrompere una scansione:
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); } }
Per analizzare solo tipi specifici di periferiche, puoi chiamare startScan(List<ScanFilter>, ScanSettings, ScanCallback)
, fornendo un elenco di oggetti ScanFilter
che limitano i dispositivi cercati dalla scansione e un oggetto ScanSettings
che specifica i parametri della scansione.
Il seguente esempio di codice è un'implementazione di ScanCallback
, che è l'interfaccia utilizzata per fornire i risultati della scansione BLE. Quando vengono trovati, i risultati vengono aggiunti a un adattatore elenco in DeviceScanActivity
per essere mostrati all'utente.
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(); } };