尋找 BLE 裝置

如要尋找 BLE 裝置,請使用 startScan() 方法。這個方法會使用 ScanCallback 做為參數。您必須實作這個回呼,因為這才會傳回掃描結果。由於掃描非常耗電,因此您應觀察下列準則:

  • 找到所需裝置後,請立即停止掃描。
  • 請勿在執行循環掃描時,一律設定掃描時間限制。之前可以使用的裝置可能已移出範圍,以便繼續掃描而減少電池的電量。

在以下範例中,BLE 應用程式提供一項活動 (DeviceScanActivity) 來掃描可用的藍牙 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();
            }
        };