Rechercher des appareils BLE

Pour rechercher des appareils BLE, utilisez la méthode startScan(). Cette méthode utilise un paramètre ScanCallback. Vous devez implémenter ce rappel, car c'est ainsi que les résultats d'analyse sont renvoyés. L'analyse sollicitant beaucoup la batterie, vous devez respecter les consignes suivantes:

  • Dès que vous avez trouvé l'appareil souhaité, arrêtez la recherche.
  • N'analysez jamais en boucle et définissez toujours une limite de temps pour l'analyse. Il est possible qu'un appareil qui était auparavant disponible se soit hors de portée, mais que la poursuite de l'analyse vide la batterie.

Dans l'exemple suivant, l'application BLE fournit une activité (DeviceScanActivity) permettant de rechercher les appareils Bluetooth LE disponibles et de les afficher sous forme de liste. L'extrait de code suivant montre comment démarrer et arrêter une analyse:

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

Pour rechercher uniquement des types de périphériques spécifiques, vous pouvez appeler startScan(List<ScanFilter>, ScanSettings, ScanCallback), en fournissant une liste d'objets ScanFilter qui limitent les appareils recherchés par l'analyse et un objet ScanSettings qui spécifie des paramètres concernant l'analyse.

L'exemple de code suivant est une implémentation de ScanCallback, qui est l'interface utilisée pour fournir des résultats d'analyse BLE. Lorsque des résultats sont trouvés, ils sont ajoutés à un adaptateur de liste dans DeviceScanActivity pour être présentés à l'utilisateur.

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