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