我试图发现蓝牙低功耗设备,但我对 onLeScan 方法有疑问。它被调用了两次,结果所有设备都翻了一番。
我用来启动扫描的方法:
private void scanLeDevice(final boolean enable) {
if (enable) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
bluetoothAdapter.stopLeScan(getLeScanCallback());
scanning = false;
}
}, SCAN_PERIOD);
scanning = true;
bluetoothAdapter.startLeScan(getLeScanCallback());
} else {
bluetoothAdapter.stopLeScan(getLeScanCallback());
scanning = false;
}
}
返回 LeScanCallback 的方法:
private BluetoothAdapter.LeScanCallback getLeScanCallback(){
BluetoothAdapter.LeScanCallback leScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice bluetoothDevice, int rssi
, byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "device found");
Device device = new Device();
device.setName(bluetoothDevice.getName());
device.setAddress(bluetoothDevice.getAddress());
devices.add(device);
deviceListAdapter.notifyDataSetChanged();
}
});
}
};
return leScanCallback;
}
最佳答案
是的,如果 BLE 设备的广告周期与扫描周期相比足够频繁,则它们可能会在扫描周期中出现多次。因此,您应该识别每个 BLE 设备(可能带有名称或地址)并将它们添加到您的列表中一次。您可以保留最近看到的信标的单独列表,或者只检查 devices
是否已包含找到的设备并避免添加重复项。 (或使用 Set
而不是 List
。)如果 BLE 设备已存在于列表中,只需更新任何数据(如 RSSI,如果你显示它)。您可能需要在 Device
中重写 equals()
和 hashCode()
来制作 List.contains()
或 Set
正常工作
关于android - onLeScan 在发现蓝牙文件设备时调用了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40928100/