From 5549e27b92385f72a9fc28ec60e5eb70689aa3bc Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 23 Jun 2015 17:24:27 +0200 Subject: Android: Apply QBluetoothSocket::preferredSecurityFlags during connect This patch permits Android clients to choose the security level before connecting to the server. This may also used by some older devices (Android 4.1 or lower) to connect if they don't support the so far predetermined secure way of connecting via rfcomm. Task-number: QTBUG-46377 Change-Id: I3f72f183e7ead16bec57a0ce83e9a96324675312 Reviewed-by: Timur Pocheptsov --- src/bluetooth/qbluetoothsocket_android.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/bluetooth/qbluetoothsocket_android.cpp b/src/bluetooth/qbluetoothsocket_android.cpp index 3c526eca..1a5f70b0 100644 --- a/src/bluetooth/qbluetoothsocket_android.cpp +++ b/src/bluetooth/qbluetoothsocket_android.cpp @@ -258,11 +258,22 @@ bool QBluetoothSocketPrivate::fallBackConnect(QAndroidJniObject uuid, int channe } } - QAndroidJniObject method = remoteDeviceClass.callObjectMethod( + QAndroidJniObject method; + if (secFlags == QBluetooth::NoSecurity) { + qCDebug(QT_BT_ANDROID) << "Connnecting via insecure rfcomm"; + method = remoteDeviceClass.callObjectMethod( + "getMethod", + "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", + QAndroidJniObject::fromString(QLatin1String("createInsecureRfcommSocket")).object(), + paramTypes.object()); + } else { + qCDebug(QT_BT_ANDROID) << "Connnecting via secure rfcomm"; + method = remoteDeviceClass.callObjectMethod( "getMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", QAndroidJniObject::fromString(QLatin1String("createRfcommSocket")).object(), paramTypes.object()); + } if (!method.isValid() || env->ExceptionCheck()) { qCWarning(QT_BT_ANDROID) << "Could not invoke getMethod"; if (env->ExceptionCheck()) { @@ -372,9 +383,17 @@ void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, "(Ljava/lang/String;)Ljava/util/UUID;", inputString.object()); - socketObject = remoteDevice.callObjectMethod("createRfcommSocketToServiceRecord", + if (secFlags == QBluetooth::NoSecurity) { + qCDebug(QT_BT_ANDROID) << "Connnecting via insecure rfcomm"; + socketObject = remoteDevice.callObjectMethod("createInsecureRfcommSocketToServiceRecord", "(Ljava/util/UUID;)Landroid/bluetooth/BluetoothSocket;", uuidObject.object()); + } else { + qCDebug(QT_BT_ANDROID) << "Connnecting via secure rfcomm"; + socketObject = remoteDevice.callObjectMethod("createRfcommSocketToServiceRecord", + "(Ljava/util/UUID;)Landroid/bluetooth/BluetoothSocket;", + uuidObject.object()); + } if (env->ExceptionCheck()) { env->ExceptionDescribe(); -- cgit v1.2.3