Buscar dispositivos BLE

Para buscar dispositivos BLE, usa el startScan() . Este método toma un ScanCallback como parámetro Debes implementar esta devolución de llamada, porque así se muestran los resultados de los escaneos. Como el escaneo consume mucha batería, debes observar lo siguiente lineamientos:

  • Deja de escanear tan pronto como encuentres el dispositivo que te interesa.
  • Nunca escanees en bucle y siempre establece un límite de tiempo. Un dispositivo que estaba disponible anteriormente puede haber salido del rango y continuar escaneando la batería se agota.

En el siguiente ejemplo, la app BLE proporciona una actividad (DeviceScanActivity) para buscar dispositivos Bluetooth LE y pantallas disponibles en una lista al usuario. El siguiente fragmento muestra cómo iniciar y detener una analizar:

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

Para buscar solo tipos de periféricos específicos, puedes llamar startScan(List<ScanFilter>, ScanSettings, ScanCallback): proporcionando una lista de ScanFilter objetos que restringen los dispositivos que busca el análisis y una ScanSettings objeto especifica los parámetros sobre el análisis.

La siguiente muestra de código es una implementación de ScanCallback: que es la interfaz que se usa para entregar los resultados del análisis BLE. Cuando se encuentran resultados, se agregan a un adaptador de lista en DeviceScanActivity para mostrarla al usuario.

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