BLE-Geräte suchen

Um BLE-Geräte zu finden, verwenden Sie die startScan() . Bei dieser Methode wird ein ScanCallback als Parameter. Sie müssen diesen Callback implementieren, da die Scanergebnisse auf diese Weise zurückgegeben werden. Da das Scannen akkuintensive Akkus beansprucht, sollten Sie Folgendes beachten: Richtlinien:

  • Beende den Scanvorgang, sobald du das gewünschte Gerät gefunden hast.
  • Scannen Sie nie in einer Schleife und legen Sie immer ein Zeitlimit für Ihren Scan fest. Ein Gerät, das die zuvor verfügbar waren, haben sich möglicherweise außerhalb der Reichweite bewegt und die Suche wird fortgesetzt. der Akku entlädt.

Im folgenden Beispiel stellt die BLE-App eine Aktivität (DeviceScanActivity) zum Suchen nach verfügbaren Bluetooth LE-Geräten und -Display in einer Liste präsentieren. Im folgenden Snippet sehen Sie, wie ein Scan:

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 Folgendes aufrufen: startScan(List<ScanFilter>, ScanSettings, ScanCallback), eine Liste mit ScanFilter Objekte einschränken, die die vom Scan durchsuchten Geräte einschränken, sowie ScanSettings-Objekt, das gibt Parameter für den Scan an.

Das folgende Codebeispiel ist eine Implementierung von ScanCallback, das die Schnittstelle ist, über die BLE-Scanergebnisse bereitgestellt werden. Wenn Ergebnisse gefunden werden, Sie werden einem Listenadapter im DeviceScanActivity hinzugefügt, um sie Nutzer.

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