android - onLeScan 在发现蓝牙文件设备时调用了两次

标签 android bluetooth bluetooth-lowenergy

我试图发现蓝牙低功耗设备,但我对 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/

相关文章:

raspberry-pi - 即使可以使用 hcitool lescan 发现设备,BLE gatttool 也无法连接

bluetooth - 网络蓝牙绕过配对屏幕

ios - BLE 设备在应用程序终止时保持与 iPhone 的连接

安卓 : gradlew lint error "Incompatible Gradle Versions"

android - 在导航 View 中以编程方式将项目添加到菜单组

android - 如何更改 Android 中的默认视频缓冲区大小

ios - 核心蓝牙无法发现外设

java - 我正在尝试下载我的网络服务器上的 pdf 文件,但是下载时我的文件已损坏

c - 号码转换问题

Linux over BlueZ 下的 C++ 蓝牙耳机