所以我能够在正常情况下连接到BLE设备.我想要做的是处理异常情况,如当一个设备连接失败或已建立的连接丢失(也许它得到扔下悬崖或车撞)
我正在使用CyPress BLE模块对此进行测试,我正在做的其中一项测试是从模块上移除电源.但是,onConnectionStateChange永远不会被调用!我所看到的只是成功的联系.它将花费数小时尝试连接,并且永远不会放弃.我会延迟取消连接尝试,但是没有办法取消BluetoothDevice上的连接尝试(我知道)!据我所知,它会继续尝试,直到电池电量耗尽.
这就是我的onConnectionStateChange现在在Gatt回调中的样子.请注意,我正在尝试捕获并记录任何类型的回调涉及任何类型的连接状态更改…除非连接成功,否则永远不会被调用.请注意,这是代码不在活动本身.它在一个由单身人士持有的物体中. (我希望保持多个活动之间的连接)
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
mGatt = gatt;
Logy.CallPrint(LOGY_ENABLE, CLASSNAME, "Status: "+status+ " Newstate: "+newState);
switch(status)
{
case BluetoothGatt.GATT_SUCCESS:
mReconnectAttempts = MAX_ATTEMPTS;
if(newState == BluetoothGatt.STATE_CONNECTED)
{
DispatchEvent(Event.Type.BT_ON_CONNECT);
bIsConnected = true;
gatt.discoverServices();
} else if (newState == BluetoothGatt.STATE_DISCONNECTED)
{
DispatchEvent(Event.Type.BT_ON_DISCONNECT);
bIsConnected = false;
}
break;
default:
if(newState == BluetoothGatt.STATE_DISCONNECTED)
{
bIsConnected = false;
if(mReconnectAttempts > 0)
{ // if we have attempts left, auto attempt to reconnect
DispatchEvent(Event.Type.BT_RECONNECTING);
mReconnectAttempts--;
gatt.connect();
bIsConnected = false;
}
else
{
mReconnectAttempts = MAX_ATTEMPTS;
DispatchEvent(Event.Type.BT_ON_CONNECT_FAIL);
bIsConnected = false;
}
} else {
Logy.CallPrint(LOGY_ENABLE, CLASSNAME, "onConnectionStateChange: Failed?");
}
}
super.onConnectionStateChange(gatt, status, newState);
}
无法检测断开是我的代码中的其他问题,例如我显示进度对话框,指示应用程序正在连接到BLE设备.那个对话永远不会消失,因为事件“On Connect Fail”永远不会被抛出.