diff options
Diffstat (limited to 'src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp')
-rw-r--r-- | src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp | 62 |
1 files changed, 54 insertions, 8 deletions
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) { |