Trova dispositivi BLE

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();
            }
        };