Aby znaleźć urządzenia BLE, należy skorzystać z
startScan()
. Ta metoda wymaga
ScanCallback
jako parametru.
Musisz zaimplementować to wywołanie zwrotne, ponieważ tak są zwracane wyniki skanowania.
Ponieważ skanowanie zużywa dużo energii, pamiętaj o tych kwestiach:
wytycznymi:
- Gdy tylko znajdziesz odpowiednie urządzenie, zatrzymaj skanowanie.
- Nigdy nie skanuj w pętli i zawsze określaj limit czasu skanowania. Urządzenie, które które było wcześniej dostępne, mogło znaleźć się poza zasięgiem i nadal skanować rozładowuje baterię.
W poniższym przykładzie aplikacja BLE udostępnia aktywność
(DeviceScanActivity
), aby wyszukać dostępne urządzenia i wyświetlacze Bluetooth LE
i wysyłaj je użytkownikowi. Ten fragment kodu pokazuje, jak uruchomić 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 wyszukać tylko określone typy urządzeń peryferyjnych, wywołaj
startScan(List<ScanFilter>, ScanSettings, ScanCallback)
zawiera listę ScanFilter
obiekty ograniczające urządzenia, których szuka skanowanie, oraz
ScanSettings
obiekt, który
określa parametry skanowania.
Poniższa próbka kodu to implementacja
ScanCallback
który służy do dostarczania wyników skanowania BLE. Po znalezieniu wyników
zostaną dodane do adaptera listy w DeviceScanActivity
, aby były wyświetlane
użytkownika.
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(); } };