Tìm thiết bị BLE

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