Найдите устройства BLE

Чтобы найти устройства BLE, вы используете метод startScan() . Этот метод принимает ScanCallback в качестве параметра. Вы должны реализовать этот обратный вызов, поскольку именно так возвращаются результаты сканирования. Поскольку сканирование требует большого количества энергии, необходимо соблюдать следующие рекомендации:

  • Как только вы найдете нужное устройство, прекратите сканирование.
  • Никогда не сканируйте в цикле и всегда устанавливайте ограничение по времени для сканирования. Ранее доступное устройство могло выйти за пределы зоны действия, и продолжение сканирования разряжает батарею.

В следующем примере приложение BLE предоставляет действие ( DeviceScanActivity ) для сканирования доступных устройств Bluetooth LE и отображения их в списке пользователю. В следующем фрагменте показано, как запустить и остановить сканирование:

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

Чтобы сканировать только определенные типы периферийных устройств, вместо этого вы можете вызвать startScan(List<ScanFilter>, ScanSettings, ScanCallback) , предоставив список объектов ScanFilter , которые ограничивают устройства, которые ищет сканирование, и объект ScanSettings , который определяет параметры сканирования. .

Следующий пример кода представляет собой реализацию ScanCallback — интерфейса, используемого для доставки результатов сканирования BLE. Когда результаты найдены, они добавляются в адаптер списка в DeviceScanActivity для отображения пользователю.

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