From 1afb57ed92a25bbc000ea4c4d7662cb8b9e267ee Mon Sep 17 00:00:00 2001 From: BogDan Vatra Date: Wed, 7 Dec 2016 17:47:37 +0200 Subject: Android: Workaround buggy BT implementation On some devices (e.g. HTC 10) calling BluetoothAdapter.getDefaultAdapter() always fails first time. Task-number: QTBUG-57489 Change-Id: I3a22a831f9a13d880756b598c408ab21a0f52126 Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothlocaldevice_android.cpp | 60 +++++++++---------------- 1 file changed, 22 insertions(+), 38 deletions(-) diff --git a/src/bluetooth/qbluetoothlocaldevice_android.cpp b/src/bluetooth/qbluetoothlocaldevice_android.cpp index 9166c9a2..f36e184c 100644 --- a/src/bluetooth/qbluetoothlocaldevice_android.cpp +++ b/src/bluetooth/qbluetoothlocaldevice_android.cpp @@ -87,18 +87,36 @@ QAndroidJniObject *QBluetoothLocalDevicePrivate::adapter() return obj; } -void QBluetoothLocalDevicePrivate::initialize(const QBluetoothAddress &address) +static QAndroidJniObject getDefaultAdapter() { - QAndroidJniEnvironment env; - QAndroidJniObject adapter = QAndroidJniObject::callStaticObjectMethod( "android/bluetooth/BluetoothAdapter", "getDefaultAdapter", "()Landroid/bluetooth/BluetoothAdapter;"); if (!adapter.isValid()) { + QAndroidJniEnvironment env; if (env->ExceptionCheck()) { env->ExceptionDescribe(); env->ExceptionClear(); } + + // workaround stupid bt implementations where first call of BluetoothAdapter.getDefaultAdapter() always fails + adapter = QAndroidJniObject::callStaticObjectMethod( + "android/bluetooth/BluetoothAdapter", "getDefaultAdapter", + "()Landroid/bluetooth/BluetoothAdapter;"); + if (!adapter.isValid()) { + if (env->ExceptionCheck()) { + env->ExceptionDescribe(); + env->ExceptionClear(); + } + } + } + return adapter; +} + +void QBluetoothLocalDevicePrivate::initialize(const QBluetoothAddress &address) +{ + QAndroidJniObject adapter = getDefaultAdapter(); + if (!adapter.isValid()) { qCWarning(QT_BT_ANDROID) << "Device does not support Bluetooth"; return; } @@ -304,37 +322,7 @@ QList QBluetoothLocalDevice::allDevices() // Android only supports max of one device (so far) QList localDevices; - QAndroidJniEnvironment env; - jclass btAdapterClass = env->FindClass("android/bluetooth/BluetoothAdapter"); - if (btAdapterClass == NULL) { - qCWarning(QT_BT_ANDROID) - << "Native registration unable to find class android/bluetooth/BluetoothAdapter"; - return localDevices; - } - - jmethodID getDefaultAdapterID - = env->GetStaticMethodID(btAdapterClass, "getDefaultAdapter", - "()Landroid/bluetooth/BluetoothAdapter;"); - if (getDefaultAdapterID == NULL) { - qCWarning(QT_BT_ANDROID) - << "Native registration unable to get method ID: " \ - "getDefaultAdapter of android/bluetooth/BluetoothAdapter"; - env->DeleteLocalRef(btAdapterClass); - return localDevices; - } - - jobject btAdapterObject = env->CallStaticObjectMethod(btAdapterClass, getDefaultAdapterID); - if (btAdapterObject == NULL) { - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - env->ExceptionClear(); - } - qCWarning(QT_BT_ANDROID) << "Device does not support Bluetooth"; - env->DeleteLocalRef(btAdapterClass); - return localDevices; - } - - QAndroidJniObject o(btAdapterObject); + QAndroidJniObject o = getDefaultAdapter(); if (o.isValid()) { QBluetoothHostInfo info; info.setName(o.callObjectMethod("getName", "()Ljava/lang/String;").toString()); @@ -342,10 +330,6 @@ QList QBluetoothLocalDevice::allDevices() "()Ljava/lang/String;").toString())); localDevices.append(info); } - - env->DeleteLocalRef(btAdapterObject); - env->DeleteLocalRef(btAdapterClass); - return localDevices; } -- cgit v1.2.3