Android NDK开发详解连接性之查找 BLE 设备
如需查找 BLE 设备,请使用 startScan() 方法。此方法接受 ScanCallback 作为参数。您必须实现此回调,因为这是返回扫描结果的方式。由于扫描会消耗大量电池电量,因此您应遵循以下准则:
找到所需设备后,立即停止扫描。
绝不进行循环扫描,并始终为扫描设置时间限制。之前可用的设备可能移到了覆盖范围之外,继续扫描会消耗电池电量。
在以下示例中,BLE 应用提供了一个 activity (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);
}
}
注意 :只有设备当前已启用蓝牙时,才能从 BluetoothAdapter 中获取 BluetoothLeScanner。如果未启用蓝牙,getBluetoothLeScanner() 会返回 null。
如需仅扫描特定类型的外围设备,您可以改为调用 startScan(List, 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();
}
};
注意 :您只能扫描蓝牙 LE 设备,或扫描传统蓝牙设备,如蓝牙概览中所述。您无法同时扫描蓝牙 LE 设备和传统设备。
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2023-11-11。