Buscar dispositivos BLE

Para encontrar dispositivos BLE, usa el método startScan(). Este método toma un objeto ScanCallback como parámetro. Debes implementar esta devolución de llamada, porque así se muestran los resultados de los escaneos. Debido a que el escaneo consume mucha batería, debes cumplir con los siguientes 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 para el análisis. Es posible que un dispositivo que estaba disponible haya estado fuera de alcance y, si se continúa analizando, la batería se agota.

En el siguiente ejemplo, la app de BLE proporciona una actividad (DeviceScanActivity) para buscar dispositivos Bluetooth LE disponibles y mostrarlos al usuario en una lista. En el siguiente fragmento, se muestra cómo iniciar y detener un análisis:

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 específicos de periféricos, puedes llamar a startScan(List<ScanFilter>, ScanSettings, ScanCallback) y proporcionar una lista de objetos ScanFilter que restrinjan los dispositivos que busca el análisis y un objeto ScanSettings que especifique los parámetros del 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 de BLE. Cuando se encuentran los resultados, se agregan a un adaptador de lista en DeviceScanActivity para mostrar 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();
            }
        };