ค้นหาอุปกรณ์ BLE

หากต้องการค้นหาอุปกรณ์ BLE ให้ใช้ startScan() วิธีนี้ต้องใช้ ScanCallback เป็นพารามิเตอร์ คุณต้องใช้ Callback นี้ เนื่องจากเป็นวิธีแสดงผลลัพธ์การสแกน เนื่องจากการสแกนจะใช้พลังงานแบตเตอรี่มาก คุณจึงควรสังเกตสิ่งต่อไปนี้ หลักเกณฑ์:

  • หยุดสแกนทันทีที่พบอุปกรณ์ที่ต้องการ
  • ไม่ต้องสแกนแบบวนซ้ำ และกำหนดขีดจำกัดเวลาในการสแกนเสมอ อุปกรณ์ที่ เคยพร้อมใช้งานก่อนหน้านี้ อาจย้ายออกห่างจากช่วง และสแกนต่อ ทำให้แบตเตอรี่หมดเร็ว

ในตัวอย่างต่อไปนี้ แอป BLE จะแสดงกิจกรรม (DeviceScanActivity) เพื่อสแกนหาอุปกรณ์ Bluetooth LE ที่พร้อมใช้งานและจอแสดงผล อยู่ในรายการให้กับผู้ใช้ ข้อมูลโค้ดต่อไปนี้แสดงวิธีเริ่มและหยุด สแกน:

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);
    }
}

หากต้องการสแกนหาอุปกรณ์ต่อพ่วงบางประเภทเท่านั้น ให้เรียก startScan(List<ScanFilter>, ScanSettings, ScanCallback) มีรายชื่อ ScanFilter ที่จำกัดอุปกรณ์ที่จะสแกน และ ScanSettings ออบเจ็กต์ที่ ระบุพารามิเตอร์เกี่ยวกับการสแกน

ตัวอย่างโค้ดต่อไปนี้เป็นการใช้งาน ScanCallback ซึ่งเป็นอินเทอร์เฟซที่ใช้แสดงผลลัพธ์การสแกน BLE เมื่อพบผลลัพธ์ ระบบจะเพิ่มแอตทริบิวต์เหล่านั้นลงในอะแดปเตอร์รายการใน DeviceScanActivity เพื่อแสดงต่อ ผู้ใช้

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