diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2020-02-01 03:07:35 +0100 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2020-02-01 03:07:35 +0100 |
commit | fc8ca2cccd684e69131907151b2beb678afdff1d (patch) | |
tree | 94c736850ca8c58249fbf6a347e8919d4940decb /src/plugins/position | |
parent | 4ee08b0770dc018e390051a35092264f0b1a789a (diff) | |
parent | 594ec018648060340bfbd96477cfd743d7133a56 (diff) | |
download | qtlocation-fc8ca2cccd684e69131907151b2beb678afdff1d.tar.gz |
Merge remote-tracking branch 'origin/5.14' into 5.15
Change-Id: Iae2b08cdf4f64d69bedeabf4633fd34b44a02ad0
Diffstat (limited to 'src/plugins/position')
-rw-r--r-- | src/plugins/position/android/src/jnipositioning.cpp | 60 | ||||
-rw-r--r-- | src/plugins/position/android/src/jnipositioning.h | 2 |
2 files changed, 34 insertions, 28 deletions
diff --git a/src/plugins/position/android/src/jnipositioning.cpp b/src/plugins/position/android/src/jnipositioning.cpp index 4812e307..05b25d98 100644 --- a/src/plugins/position/android/src/jnipositioning.cpp +++ b/src/plugins/position/android/src/jnipositioning.cpp @@ -44,7 +44,6 @@ #include <QtGlobal> #include <QtCore/private/qjnihelpers_p.h> #include <android/log.h> -#include <jni.h> #include <QGeoPositionInfo> #include "qgeopositioninfosource_android_p.h" #include "qgeosatelliteinfosource_android_p.h" @@ -351,6 +350,9 @@ namespace AndroidPositioning { if (!env.jniEnv) return QGeoPositionInfo(); + if (!requestionPositioningPermissions(env.jniEnv)) + return {}; + jobject location = env.jniEnv->CallStaticObjectMethod(positioningClass, lastKnownPositionMethodId, fromSatellitePositioningMethodsOnly); @@ -383,19 +385,8 @@ namespace AndroidPositioning { QGeoPositionInfoSourceAndroid *source = AndroidPositioning::idToPosSource()->value(androidClassKey); if (source) { - // Android v23+ requires runtime permission check and requests - QString permission(QLatin1String("android.permission.ACCESS_FINE_LOCATION")); - - if (QtAndroidPrivate::checkPermission(permission) == QtAndroidPrivate::PermissionsResult::Denied) { - const QHash<QString, QtAndroidPrivate::PermissionsResult> results = - QtAndroidPrivate::requestPermissionsSync(env.jniEnv, QStringList() << permission); - if (!results.contains(permission) - || results[permission] == QtAndroidPrivate::PermissionsResult::Denied) - { - qWarning() << "Position retrieval not possible due to missing permission (ACCESS_FINE_LOCATION)"; - return QGeoPositionInfoSource::AccessError; - } - } + if (!requestionPositioningPermissions(env.jniEnv)) + return QGeoPositionInfoSource::AccessError; int errorCode = env.jniEnv->CallStaticIntMethod(positioningClass, startUpdatesMethodId, androidClassKey, @@ -434,19 +425,8 @@ namespace AndroidPositioning { QGeoPositionInfoSourceAndroid *source = AndroidPositioning::idToPosSource()->value(androidClassKey); if (source) { - // Android v23+ requires runtime permission check and requests - QString permission(QLatin1String("android.permission.ACCESS_FINE_LOCATION")); - - if (QtAndroidPrivate::checkPermission(permission) == QtAndroidPrivate::PermissionsResult::Denied) { - const QHash<QString, QtAndroidPrivate::PermissionsResult> results = - QtAndroidPrivate::requestPermissionsSync(env.jniEnv, QStringList() << permission); - if (!results.contains(permission) - || results[permission] == QtAndroidPrivate::PermissionsResult::Denied) - { - qWarning() << "Position update not possible due to missing permission (ACCESS_FINE_LOCATION)"; - return QGeoPositionInfoSource::AccessError; - } - } + if (!requestionPositioningPermissions(env.jniEnv)) + return QGeoPositionInfoSource::AccessError; int errorCode = env.jniEnv->CallStaticIntMethod(positioningClass, requestUpdateMethodId, androidClassKey, @@ -473,6 +453,9 @@ namespace AndroidPositioning { QGeoSatelliteInfoSourceAndroid *source = AndroidPositioning::idToSatSource()->value(androidClassKey); if (source) { + if (!requestionPositioningPermissions(env.jniEnv)) + return QGeoSatelliteInfoSource::AccessError; + int interval = source->updateInterval(); if (isSingleRequest) interval = requestTimeout; @@ -492,8 +475,29 @@ namespace AndroidPositioning { } return QGeoSatelliteInfoSource::UnknownSourceError; } -} + bool requestionPositioningPermissions(JNIEnv *env) + { + using namespace QtAndroidPrivate; + + if (androidSdkVersion() < 23) + return true; + + // Android v23+ requires runtime permission check and requests + QString permission(QLatin1String("android.permission.ACCESS_FINE_LOCATION")); + + if (checkPermission(permission) == PermissionsResult::Denied) { + const QHash<QString, PermissionsResult> results = + requestPermissionsSync(env, QStringList() << permission); + if (!results.contains(permission) || results[permission] == PermissionsResult::Denied) { + qWarning() << "Position data not available due to missing permission " << permission; + return false; + } + } + + return true; + } +} static void positionUpdated(JNIEnv *env, jobject /*thiz*/, jobject location, jint androidClassKey, jboolean isSingleUpdate) { diff --git a/src/plugins/position/android/src/jnipositioning.h b/src/plugins/position/android/src/jnipositioning.h index 0de6a5aa..0c051b8c 100644 --- a/src/plugins/position/android/src/jnipositioning.h +++ b/src/plugins/position/android/src/jnipositioning.h @@ -40,6 +40,7 @@ #ifndef JNIPOSITIONING_H #define JNIPOSITIONING_H +#include <jni.h> #include <QGeoPositionInfoSource> #include <QGeoSatelliteInfoSource> @@ -58,6 +59,7 @@ namespace AndroidPositioning QGeoSatelliteInfoSource::Error startSatelliteUpdates(int androidClassKey, bool isSingleRequest, int updateRequestTimeout); + bool requestionPositioningPermissions(JNIEnv *env); } #endif // JNIPOSITIONING_H |