From 3e66f99c623c43ad132cae86285ffc35ada3148e Mon Sep 17 00:00:00 2001 From: Aleksander Nowakowski Date: Wed, 2 Feb 2022 12:24:16 +0100 Subject: [PATCH] Trying to discover services despite initial bonding failure --- .../nordicsemi/android/ble/BleManagerHandler.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/ble/src/main/java/no/nordicsemi/android/ble/BleManagerHandler.java b/ble/src/main/java/no/nordicsemi/android/ble/BleManagerHandler.java index 2f5e44f9..db5aa0ec 100644 --- a/ble/src/main/java/no/nordicsemi/android/ble/BleManagerHandler.java +++ b/ble/src/main/java/no/nordicsemi/android/ble/BleManagerHandler.java @@ -317,10 +317,23 @@ public void onReceive(final Context context, final Intent intent) { postCallback(c -> c.onBondingFailed(device)); postBondingStateChange(o -> o.onBondingFailed(device)); log(Log.WARN, () -> "Bonding failed"); - if (request != null) { // CREATE_BOND request + if (request != null && request.type == Request.Type.CREATE_BOND) { request.notifyFail(device, FailCallback.REASON_REQUEST_FAILED); request = null; } + // If the device started to pair just after the connection was + // established the services were not discovered. We may try to discover services + // despite the fail bonding process. + // See: https://github.com/NordicSemiconductor/Android-BLE-Library/issues/335 + if (!servicesDiscovered && !serviceDiscoveryRequested) { + post(() -> { + serviceDiscoveryRequested = true; + log(Log.VERBOSE, () -> "Discovering services..."); + log(Log.DEBUG, () -> "gatt.discoverServices()"); + bluetoothGatt.discoverServices(); + }); + return; + } } else if (previousBondState == BluetoothDevice.BOND_BONDED) { if (request != null && request.type == Request.Type.REMOVE_BOND) { // The device has already disconnected by now.