Để tìm các thiết bị BLE, hãy sử dụng phương thức startScan()
. Phương thức này lấy ScanCallback
làm tham số.
Bạn phải triển khai lệnh gọi lại này vì đó là cách trả về kết quả quét.
Vì quá trình quét tốn nhiều pin, nên bạn nên tuân thủ các nguyên tắc sau:
- Ngay khi bạn tìm thấy thiết bị mong muốn, hãy ngừng quét.
- Không bao giờ quét theo vòng lặp và luôn đặt giới hạn thời gian quét. Một thiết bị từng sử dụng được có thể đã di chuyển ra ngoài phạm vi và tiếp tục quét sẽ làm tiêu hao pin.
Trong ví dụ sau, ứng dụng BLE cung cấp một hoạt động (DeviceScanActivity
) để quét tìm các thiết bị Bluetooth LE có sẵn và cho người dùng thấy các thiết bị đó. Đoạn mã sau cho biết cách bắt đầu và dừng quét:
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); } }
Để chỉ quét một số loại thiết bị ngoại vi cụ thể, bạn có thể gọi startScan(List<ScanFilter>, ScanSettings, ScanCallback)
, cung cấp danh sách các đối tượng ScanFilter
hạn chế các thiết bị mà quá trình quét tìm kiếm và đối tượng ScanSettings
chỉ định các tham số về quá trình quét.
Mã mẫu sau đây là cách triển khai ScanCallback
, là giao diện dùng để cung cấp kết quả quét BLE. Khi tìm thấy kết quả, kết quả sẽ được thêm vào bộ chuyển đổi danh sách trong DeviceScanActivity
để hiển thị cho người dùng.
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(); } };