From bf8075b3e11f7e33dd5c1197066e2f5f7a6e2d72 Mon Sep 17 00:00:00 2001 From: Vyacheslav Koscheev Date: Wed, 14 Oct 2020 10:19:42 +0700 Subject: Android: fix Location properties According to android doc getAltitude, getAccuracy, getVerticalAccuracyMeters, getSpeed, getBearing & getAltitude returns 0.0 if location does not have this value. Corresponding has* method can return false positive on some devices. e.g. Huawei P20 Pro Change-Id: I887412cf2cff05414de08c774947d969fc69aa92 Reviewed-by: Alex Blasche --- .../position/android/src/jnipositioning.cpp | 25 +++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/plugins/position/android/src/jnipositioning.cpp b/src/plugins/position/android/src/jnipositioning.cpp index 05b25d98..a9fe6ae7 100644 --- a/src/plugins/position/android/src/jnipositioning.cpp +++ b/src/plugins/position/android/src/jnipositioning.cpp @@ -223,7 +223,10 @@ namespace AndroidPositioning { if (attributeExists) { mid = getCachedMethodID(jniEnv, thisClass, "getAltitude", "()D"); jdouble value = jniEnv->CallDoubleMethod(location, mid); - coordinate.setAltitude(value); + if (value != 0.0) + { + coordinate.setAltitude(value); + } } info.setCoordinate(coordinate); @@ -239,7 +242,10 @@ namespace AndroidPositioning { if (attributeExists) { mid = getCachedMethodID(jniEnv, thisClass, "getAccuracy", "()F"); jfloat accuracy = jniEnv->CallFloatMethod(location, mid); - info.setAttribute(QGeoPositionInfo::HorizontalAccuracy, qreal(accuracy)); + if (accuracy != 0.0) + { + info.setAttribute(QGeoPositionInfo::HorizontalAccuracy, qreal(accuracy)); + } } //vertical accuracy @@ -250,7 +256,10 @@ namespace AndroidPositioning { mid = getCachedMethodID(jniEnv, thisClass, "getVerticalAccuracyMeters", "()F"); if (mid) { jfloat accuracy = jniEnv->CallFloatMethod(location, mid); - info.setAttribute(QGeoPositionInfo::VerticalAccuracy, qreal(accuracy)); + if (accuracy != 0.0) + { + info.setAttribute(QGeoPositionInfo::VerticalAccuracy, qreal(accuracy)); + } } } } @@ -264,7 +273,10 @@ namespace AndroidPositioning { if (attributeExists) { mid = getCachedMethodID(jniEnv, thisClass, "getSpeed", "()F"); jfloat speed = jniEnv->CallFloatMethod(location, mid); - info.setAttribute(QGeoPositionInfo::GroundSpeed, qreal(speed)); + if (speed != 0) + { + info.setAttribute(QGeoPositionInfo::GroundSpeed, qreal(speed)); + } } //bearing @@ -273,7 +285,10 @@ namespace AndroidPositioning { if (attributeExists) { mid = getCachedMethodID(jniEnv, thisClass, "getBearing", "()F"); jfloat bearing = jniEnv->CallFloatMethod(location, mid); - info.setAttribute(QGeoPositionInfo::Direction, qreal(bearing)); + if (bearing != 0.0) + { + info.setAttribute(QGeoPositionInfo::Direction, qreal(bearing)); + } } jniEnv->DeleteLocalRef(thisClass); -- cgit v1.2.1