diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2020-02-22 03:02:28 +0100 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2020-02-22 03:02:28 +0100 |
commit | 79702f744e4906155736967dea1af5433355c71a (patch) | |
tree | 9dedf9dfeb25f1ef49f6c4480ee7d2ee6c6618ec | |
parent | d740076c78252de049beb56b553c8d297af2ac1e (diff) | |
parent | a2769b323dc890def9dffaf98c768cec12eba3c0 (diff) | |
download | qtconnectivity-79702f744e4906155736967dea1af5433355c71a.tar.gz |
Merge remote-tracking branch 'origin/5.14' into 5.15v5.15.0-beta1
Change-Id: Iea61654bd94c9bb4be0736a5d5512fb42d845488
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java | 8 | ||||
-rw-r--r-- | src/bluetooth/bluetooth.pro | 1 | ||||
-rw-r--r-- | src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp | 62 |
4 files changed, 63 insertions, 10 deletions
@@ -18,7 +18,7 @@ moc_*.cpp ui_*.h qrc_*.cpp *.moc -*so-deployment-settings.json +*deployment-settings.json .qmake.cache .pch QtBluetooth.version* diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java index 8a69b4c7..f70ee8a4 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLE.java @@ -162,7 +162,13 @@ public class QtBluetoothLE { mBluetoothLeScanner.startScan(filterList, settings, leScanCallback21); mLeScanRunning = true; } else { - mBluetoothLeScanner.stopScan(leScanCallback21); + try { + mBluetoothLeScanner.stopScan(leScanCallback21); + } catch (IllegalStateException isex) { + // when trying to stop a scan while bluetooth is offline + // java.lang.IllegalStateException: BT Adapter is not turned ON + Log.d(TAG, "Stopping LE scan not possible: " + isex.getMessage()); + } mLeScanRunning = false; } diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index f09564cd..9f42b34e 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -137,6 +137,7 @@ qtConfig(bluez) { ANDROID_PERMISSIONS = \ android.permission.BLUETOOTH \ android.permission.BLUETOOTH_ADMIN \ + android.permission.ACCESS_FINE_LOCATION \ android.permission.ACCESS_COARSE_LOCATION # since Android 6.0 (API lvl 23) ANDROID_BUNDLED_JAR_DEPENDENCIES = \ jar/QtAndroidBluetooth.jar:org.qtproject.qt5.android.bluetooth.QtBluetoothBroadcastReceiver diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp index d8cc5ace..fd17faee 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp @@ -185,6 +185,44 @@ void QBluetoothDeviceDiscoveryAgentPrivate::start(QBluetoothDeviceDiscoveryAgent qCWarning(QT_BT_ANDROID) << "ACCESS_COARSE|FINE_LOCATION permission available"; } + // Double check Location service is turned on + bool locationTurnedOn = true; // backwards compatible behavior to previous Qt versions + const QAndroidJniObject locString = QAndroidJniObject::getStaticObjectField( + "android/content/Context", "LOCATION_SERVICE", "Ljava/lang/String;"); + const QAndroidJniObject locService = QtAndroid::androidContext().callObjectMethod( + "getSystemService", + "(Ljava/lang/String;)Ljava/lang/Object;", + locString.object<jstring>()); + + if (locService.isValid()) { + if (QtAndroid::androidSdkVersion() >= 28) { + locationTurnedOn = bool(locService.callMethod<jboolean>("isLocationEnabled")); + } else { + // try GPS and network provider + QAndroidJniObject provider = QAndroidJniObject::getStaticObjectField( + "android/location/LocationManager", "GPS_PROVIDER", "Ljava/lang/String;"); + bool gpsTurnedOn = bool(locService.callMethod<jboolean>("isProviderEnabled", + "(Ljava/lang/String;)Z", provider.object<jstring>())); + + provider = QAndroidJniObject::getStaticObjectField( + "android/location/LocationManager", "NETWORK_PROVIDER", "Ljava/lang/String;"); + bool providerTurnedOn = bool(locService.callMethod<jboolean>("isProviderEnabled", + "(Ljava/lang/String;)Z", provider.object<jstring>())); + + locationTurnedOn = gpsTurnedOn || providerTurnedOn; + } + } + + if (!locationTurnedOn) { + qCWarning(QT_BT_ANDROID) << "Search not possible due to turned off Location service"; + lastError = QBluetoothDeviceDiscoveryAgent::UnknownError; + errorString = QBluetoothDeviceDiscoveryAgent::tr("Location service turned off. Search is not possible."); + emit q->error(lastError); + return; + } + + qCDebug(QT_BT_ANDROID) << "Location turned on"; + // install Java BroadcastReceiver if (!receiver) { // SDP based device discovery @@ -201,17 +239,25 @@ void QBluetoothDeviceDiscoveryAgentPrivate::start(QBluetoothDeviceDiscoveryAgent if (requestedMethods & QBluetoothDeviceDiscoveryAgent::ClassicMethod) { const bool success = adapter.callMethod<jboolean>("startDiscovery"); if (!success) { - lastError = QBluetoothDeviceDiscoveryAgent::InputOutputError; - errorString = QBluetoothDeviceDiscoveryAgent::tr("Classic Discovery cannot be started"); - emit q->error(lastError); + qCDebug(QT_BT_ANDROID) << "Classic Discovery cannot be started"; + if (requestedMethods == QBluetoothDeviceDiscoveryAgent::ClassicMethod) { + //only classic discovery requested -> error out + lastError = QBluetoothDeviceDiscoveryAgent::InputOutputError; + errorString = QBluetoothDeviceDiscoveryAgent::tr("Classic Discovery cannot be started"); + + emit q->error(lastError); + return; + } // else fall through to LE discovery + } else { + m_active = SDPScanActive; + qCDebug(QT_BT_ANDROID) + << "QBluetoothDeviceDiscoveryAgentPrivate::start() - Classic search successfully started."; return; } + } - m_active = SDPScanActive; - qCDebug(QT_BT_ANDROID) - << "QBluetoothDeviceDiscoveryAgentPrivate::start() - Classic search successfully started."; - } else { - // LE search only requested + if (requestedMethods & QBluetoothDeviceDiscoveryAgent::LowEnergyMethod) { + // LE search only requested or classic discovery failed but lets try LE scan anyway Q_ASSERT(requestedMethods & QBluetoothDeviceDiscoveryAgent::LowEnergyMethod); if (QtAndroidPrivate::androidSdkVersion() < 18) { |