Znajdź urządzenia z BLE

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