Чтобы найти устройства 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(); } };