2

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

searchFirstLowEnergyThenClassic() 或 searchFirstClassicThenLowEnergy()

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

这是我的实现:

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

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

因此,您可能会猜到,它变得更加复杂。例如,当经典 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。如果可能的话,非常感谢没有广播意图的解决方案。

4

2 回答 2

6

BluetoothAdapter 的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)
{   

}

因此,不需要单独搜索。

于 2015-06-10T13:35:46.327 回答
-1

startLESCan 是一种更先进、更好的蓝牙设备扫描方法,具有一些进步,例如降低能耗。

于 2016-12-19T18:25:38.137 回答