BLE-Geräte suchen

BLE-Geräte finden Sie mit der Methode startScan(). Bei dieser Methode wird ein ScanCallback als Parameter verwendet. Sie müssen diesen Callback implementieren, da so die Scanergebnisse zurückgegeben werden. Da das Scannen Batterie-intensiv ist, sollten Sie die folgenden Richtlinien beachten:

  • Sobald du das gewünschte Gerät gefunden hast, beende die Suche.
  • Scannen Sie nie in einer Schleife und legen Sie für den Scan immer ein Zeitlimit fest. Ein zuvor verfügbares Gerät hat sich möglicherweise nicht mehr in Reichweite befunden und der Akku wird schneller gescannt.

Im folgenden Beispiel bietet die BLE-App eine Aktivität (DeviceScanActivity), um nach verfügbaren Bluetooth LE-Geräten zu suchen und sie dem Nutzer in einer Liste anzuzeigen. Das folgende Snippet zeigt, wie Sie einen Scan starten und beenden:

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

Wenn Sie nur nach bestimmten Arten von Peripheriegeräten suchen möchten, können Sie stattdessen startScan(List<ScanFilter>, ScanSettings, ScanCallback) aufrufen und eine Liste von ScanFilter-Objekten angeben, die die Geräte einschränken, nach denen der Scan sucht, und ein ScanSettings-Objekt, das Parameter für den Scan angibt.

Das folgende Codebeispiel ist eine Implementierung von ScanCallback. Über diese Schnittstelle werden BLE-Scanergebnisse gesendet. Die gefundenen Ergebnisse werden einem Listenadapter im DeviceScanActivity hinzugefügt, damit sie dem Nutzer angezeigt werden.

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