问题
I connect to a BLE device with the connectGatt()
method in Android. This works great.
When I disconnect I use the following:
private void disconnectDevice() {
gatt.disconnect();
}
When I receive the callback I do a close.
private BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
switch (newState) {
case BluetoothProfile.STATE_CONNECTED:
Log.d("BLED-GATT", "STATE_CONNECTED");
setUIConnectionStatus("Discover services on device...", Color.YELLOW);
checkEnableAddButton(simpleTrackEditText.getText().toString());
gatt.discoverServices();
break;
case BluetoothProfile.STATE_DISCONNECTED:
Log.d("BLED-GATT", "STATE_DISCONNECTED");
setUIConnectionStatus("Not Connected!", Color.RED);
gatt.close();
break;
default:
Log.d("BLED-GATT", "STATE_OTHER");
}
}
}
This is executed and I can no longer control the device after calling disconnectDevice()
. The device itself seems to think that it is still connected since I cant put it in broadcasting visibility mode (which happens if it already has a connection). However, if I kill the application and open it again then I can set the device in broadcasting mode. This tells me the app was not properly disconnected.
Any idea what I missed here?
回答1:
The problem was that I during scanning was connecting to the same device multiple times causing my application to have many connections open at the same time. Adding !isConnected()
solved the problem:
/**
* Connects to the device. Does nothing if already connected.
* @param macAddress the address of the device.
*/
private void connectDevice(String macAddress) {
if (!isConnected()) {
device = bluetoothAdapter.getRemoteDevice(macAddress);
if (device == null) {
this.sendToast("Device Not Available");
} else {
Log.d("BLED", "Connecting...");
gatt = device.connectGatt(this, true, gattCallback);
}
}
}
回答2:
That's totally logic because you are not disconnecting before closing Gatt.
public void disconnect() {
if (mBluetoothAdapter == null || mBluetoothGatt == null) {
Log.w(TAG, "BluetoothAdapter not initialized");
return;
}
mBluetoothGatt.disconnect();
}
try to call this method before closing your GATT
回答3:
I experienced same problem and I found two possible root cause as follows: 1. Was same as @nilsi answer, connect to the same device more than once in one scanning. → solved by lock & List 2. connect to the device in one scanning and didn't get onConnectionStateChange, than I scanned again, it resulted in second connection to the same device. → solved by keeping BluetoothGatt object when I call device.connectGatt(), and call object.disconnect(), object.close() before scanning.
My test phone is 4 years old so sometimes it needs more than 20 seconds to return onConnectionStateChange....
来源:https://stackoverflow.com/questions/35986549/totally-disconnect-a-bluetooth-low-energy-device