diff options
author | Alex Blasche <alexander.blasche@qt.io> | 2016-09-14 12:12:09 +0200 |
---|---|---|
committer | Alex Blasche <alexander.blasche@qt.io> | 2016-09-21 10:49:41 +0000 |
commit | e09a25a24e7f834c91d383e27b4546b0cda42fe8 (patch) | |
tree | be2a953324090cdcb9ad9cf8ad9f1ed6d052641a | |
parent | 66a6bd9fb20e76ab288e4eef59d06c06a411a471 (diff) | |
download | qtlocation-e09a25a24e7f834c91d383e27b4546b0cda42fe8.tar.gz |
Add capability to ask for Location permission at runtime
This is required since Android v23+.
Task-number: QTBUG-55988
Change-Id: I41777cfbb6fde38dc0f8045c9320f420bb0b43a2
Reviewed-by: BogDan Vatra <bogdan@kdab.com>
-rw-r--r-- | src/plugins/position/android/src/jnipositioning.cpp | 29 | ||||
-rw-r--r-- | src/plugins/position/android/src/src.pro | 2 |
2 files changed, 30 insertions, 1 deletions
diff --git a/src/plugins/position/android/src/jnipositioning.cpp b/src/plugins/position/android/src/jnipositioning.cpp index e0124eb6..547d0fad 100644 --- a/src/plugins/position/android/src/jnipositioning.cpp +++ b/src/plugins/position/android/src/jnipositioning.cpp @@ -41,6 +41,7 @@ #include <QDebug> #include <QMap> #include <QtGlobal> +#include <QtCore/private/qjnihelpers_p.h> #include <android/log.h> #include <jni.h> #include <QGeoPositionInfo> @@ -367,6 +368,20 @@ 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; + } + } + int errorCode = env.jniEnv->CallStaticIntMethod(positioningClass, startUpdatesMethodId, androidClassKey, positioningMethodToInt(source->preferredPositioningMethods()), @@ -404,6 +419,20 @@ 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; + } + } + int errorCode = env.jniEnv->CallStaticIntMethod(positioningClass, requestUpdateMethodId, androidClassKey, positioningMethodToInt(source->preferredPositioningMethods())); diff --git a/src/plugins/position/android/src/src.pro b/src/plugins/position/android/src/src.pro index 3a19c85e..36facc55 100644 --- a/src/plugins/position/android/src/src.pro +++ b/src/plugins/position/android/src/src.pro @@ -1,6 +1,6 @@ TARGET = qtposition_android -QT = core positioning +QT = core core-private positioning HEADERS = \ positionfactory_android.h \ |