Per trovare i dispositivi BLE, utilizza la
startScan()
. Questo metodo prende un
ScanCallback
come parametro.
Devi implementare questo callback perché è in questo modo che vengono restituiti i risultati della scansione.
La scansione consuma molta batteria, pertanto devi osservare quanto segue
linee guida:
- Non appena trovi il dispositivo desiderato, interrompi la scansione.
- Non scansionare mai in loop e imposta sempre un limite di tempo per la scansione. Un dispositivo che precedentemente disponibile potrebbe essersi spostato fuori intervallo. La scansione continua consuma la batteria.
Nell'esempio seguente, l'app BLE fornisce un'attività
(DeviceScanActivity
) per cercare dispositivi e display Bluetooth LE disponibili
in un elenco. Il seguente snippet mostra come avviare e interrompere un
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 eseguire la scansione solo di tipi specifici di periferiche, puoi invece chiamare
startScan(List<ScanFilter>, ScanSettings, ScanCallback)
,
fornendo un elenco di ScanFilter
che limitano i dispositivi cercati dalla scansione e un
ScanSettings
che
e specifica i parametri della scansione.
Il seguente esempio di codice è un'implementazione
ScanCallback
,
ovvero l'interfaccia utilizzata per fornire i risultati della scansione BLE. Quando vengono trovati risultati,
vengono aggiunti a un adattatore elenco in DeviceScanActivity
per mostrarli
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(); } };