Tìm thiết bị BLE

Để tìm thiết bị BLE, bạn sử dụng startScan() . Phương thức này lấy một ScanCallback làm thông số. Bạn phải triển khai lệnh gọi lại này vì đó là kết quả quét được trả về. Vì quá trình quét tốn nhiều pin, bạn nên quan sát những điều sau nguyên tắc:

  • 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 cho lần quét. Một thiết bị khả năng truy cập trước đó có thể đã di chuyển ra khỏi phạm vi và đang 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 và màn hình hiện có chúng vào danh sách cho người dùng. Đoạn mã sau đây cho biết cách bắt đầu và dừng một 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 tìm 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 một danh sách ScanFilter các đối tượng này hạn chế thiết bị mà quá trình quét tìm kiếm và ScanSettings đối tượng chỉ định các tham số 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ả, chúng sẽ được thêm vào bộ chuyển đổi danh sách trong DeviceScanActivity để hiển thị trên 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();
            }
        };