Aby znaleźć urządzenia BLE, użyj metody startScan()
. Ta metoda przyjmuje ScanCallback
jako parametr.
Musisz zaimplementować to wywołanie zwrotne, ponieważ właśnie w ten sposób są zwracane wyniki skanowania.
Skanowanie zużywa dużo baterii, dlatego musisz przestrzegać tych wytycznych:
- Gdy tylko znajdziesz odpowiednie urządzenie, zatrzymaj skanowanie.
- Nigdy nie skanuj w pętli i zawsze ustawiaj limit czasu skanowania. Urządzenie, które było wcześniej dostępne, mogło znaleźć się poza zasięgiem i nadal skanować baterię.
W poniższym przykładzie aplikacja BLE udostępnia aktywność (DeviceScanActivity
), by przeprowadzić skanowanie w poszukiwaniu dostępnych urządzeń Bluetooth LE i wyświetlić je użytkownikowi na liście. Ten fragment kodu pokazuje, jak rozpocząć i zatrzymać skanowanie:
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); } }
Aby skanować w poszukiwaniu tylko określonych typów urządzeń peryferyjnych, możesz zamiast tego wywołać metodę startScan(List<ScanFilter>, ScanSettings, ScanCallback)
, podając listę obiektów ScanFilter
, które ograniczają liczbę urządzeń wyszukiwanych przez skanowanie, oraz obiekt ScanSettings
określający parametry skanowania.
Poniższy przykładowy kod to implementacja ScanCallback
, który służy do dostarczania wyników skanowania BLE. Po znalezieniu wyników są one dodawane do adaptera listy w DeviceScanActivity
, aby wyświetlić je użytkownikowi.
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(); } };