gpt4 book ai didi

Android 蓝牙设备按顺序扫描/发现经典和低功耗设备

转载 作者:行者123 更新时间:2023-12-04 21:53:38 28 4
gpt4 key购买 nike

我正在开发一个 Android 应用程序,用于搜索经典和低功耗蓝牙设备,这样当我按下“搜索”按钮时,它会向我显示范围内的所有蓝牙设备(低功耗和经典)。由于经典的 BT 发现和 LE 扫描是不同的事情,因此我必须单独实现它们并将它们组合在一个函数中,这样

searchFirstLowEnergyThenClassic() 或 searchFirstClassicThenLowEnergy()

为了实现这一点,我必须知道发现/扫描何时结束,以便我立即开始扫描/发现其他技术。

这是我的实现:

  1. 开始经典 BT 发现
  2. 已收到蓝牙适配器。ACTION_DISCOVERY_FINISHED
  3. 已开始 BLE 扫描 -> onReceive 操作等于(ACTION_DISCOVERY_FINISHED)
  4. BLE 扫描结束时停止搜索

这看起来不错,但是当我扩展行为时出现问题。当我想要搜索时,我首先使用 LE 扫描或基于上次连接技术的经典发现进行搜索。例如,如果设备上次连接到 Classic BT 设备,则会运行 searchFirstClassicThenLowEnergy()。否则,searchFirstLowEnergyThenClassic()。

正如您可能猜到的那样,事情变得更加复杂。例如,当经典 BT 发现结束时,应用程序应该知道搜索是结束还是应该继续进行 LE 扫描。

也有这个问题。当用户在扫描/发现第一种技术期间停止搜索时,它将收到BluetoothAdapter.ACTION_DISCOVERY_FINISHED,但它不应启动LE扫描,因为搜索已被用户终止。

我使用一些标志实现了这个(尽管不能正常工作),但我的代码看起来很脏。

else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
// Classic Bluetooth discovery ended
lastOpenedType = getLastOpenedType();
if (lastOpenedType == BT_CLASSIC && !isSearchStoppedByUser()) {
// Search should continue with low energy scan
startBtLeScanning();
} else if (lastOpenedType != BT_CLASSIC && !isSearchStoppedByUser()){
// Search ended
searchProgressLayout.setVisibility(View.INVISIBLE);
} else {
// Search ended by user
searchProgressLayout.setVisibility(View.INVISIBLE);
}
}

简而言之,我想问是否有人对此有更出色、更简单的解决方案?

PS。如果可能的话,非常感谢没有广播 Intent 的解决方案。

最佳答案

蓝牙适配器的 startDiscovery()方法搜索经典设备和 BLE 设备。获得扫描结果后,您可以根据设备类型将它们分开。例如:

int deviceType = device.getType();

if(deviceType == BluetoothDevice.DEVICE_TYPE_CLASSIC)
{

}
else if(deviceType == BluetoothDevice.DEVICE_TYPE_LE)
{

}
else if(deviceType == BluetoothDevice.DEVICE_TYPE_DUAL)
{

}

所以,不需要单独搜索。

关于Android 蓝牙设备按顺序扫描/发现经典和低功耗设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27169468/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com