在没有BluetoothGATT的情况下断开BluetoothDevice

时间:2015-11-20 22:54:28

标签: android bluetooth-lowenergy android-ble

我的应用与BLE外设通话。有时,应用程序启动时已连接该外围设备。我可以通过调用以下方式检索设备:

BluetoothManager manager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
List<BluetoothDevice> connectedDevices = manager.getConnectedDevices(BluetoothProfile.GATT);

然后我可以根据地址或UUID过滤connectedDevices。但是,BluetoothDevice没有断开连接方法。要断开连接,我需要一个BluetoothGATT实例。但我能看到获得BluetoothGATT实例的唯一方法是致电

connectedDevice.connectGatt(Context, boolean, BluetoothGattCallback)

这需要很长时间。除此之外,我在调用connectGatt后回来的BluetoothGatt实例在调用disconnect()时似乎并没有实际断开外围设备。

所以我的问题是:

  • 有没有办法断开连接的BluetoothDevice而无需调用connectGatt?
  • 为什么connectGatt需要这么长时间才能连接已经连接的设备?
  • 在连接的BluetoothDevice上调用connectGatt是否有效?

谢谢

2 个答案:

答案 0 :(得分:0)

  

有时应用程序是在已经连接的外围设备的情况下启动的。

这意味着其他一些应用程序连接到外围设备。当然,您无法断开某些其他应用的连接。连接外围设备的应用程序也必须断开连接。

答案 1 :(得分:0)

对于我的项目,我找到了这个解决方法,不知道它是否是最好的解决方案,但也许它可以帮助某人。

声明一个 BluetoothGatt 列表:

List<BluetoothGatt> gattList = new ArrayList<>();

在 OnConnectionStateChange 中,每次连接新设备时,将他的 gatt 对象添加到列表中:

public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    super.onConnectionStateChange(gatt, status, newState);
    if (newState == BluetoothProfile.STATE_CONNECTED) {                  
        gattList.add(gatt) ;
    }       
}

使用像这样的函数使用 BluetoothDevice 地址(更容易检索)获取 gatt 对象:

public BluetoothGatt getGattFromAddress(String address) {
    BluetoothGatt gatt = null ;
    for(int i=0; i<gattList.size(); i++)    {
        if(address.equals(gattList.get(i).getDevice().getAddress()))
            gatt = gattList.get(i);
    }
    return gatt ;
}

执行 gatt 操作:

getGattFromAddress(bleDeviceAddress).disconnect();