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