summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Blasche <alexander.blasche@qt.io>2016-09-13 14:08:19 +0200
committerAlex Blasche <alexander.blasche@qt.io>2016-09-21 10:49:37 +0000
commitd6fd07c9260f5a1411f8e6468182f1096344b146 (patch)
tree197ecc9fb034cbb88f68f706098eca671ed96fd9
parent9d22c12fe4bc6b19c83aa6cf421b90dbeae5f045 (diff)
Check Location permissions before running LE scan on Android
This patch requires new private API in QtCore to handle responses when requesting Location permissions. Task-number: QTBUG-55035 Change-Id: I3a6434b9d2d4f66094ed2a4f59667665bd0a905c Reviewed-by: BogDan Vatra <bogdan@kdab.com>
-rw-r--r--src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp
index 3349d73b..411e7a2b 100644
--- a/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp
+++ b/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp
@@ -137,6 +137,32 @@ void QBluetoothDeviceDiscoveryAgentPrivate::start(QBluetoothDeviceDiscoveryAgent
return;
}
+ // check Android v23+ permissions
+ // -> BTLE search requires android.permission.ACCESS_COARSE_LOCATION
+ if (requestedMethods && QBluetoothDeviceDiscoveryAgent::LowEnergyMethod) {
+ QString permission(QLatin1String("android.permission.ACCESS_COARSE_LOCATION"));
+
+ // do we have required permission already, if so nothing to do
+ if (QtAndroidPrivate::checkPermission(permission) == QtAndroidPrivate::PermissionsResult::Denied) {
+ qCWarning(QT_BT_ANDROID) << "Requesting ACCESS_COARSE_LOCATION permission";
+
+ QAndroidJniEnvironment env;
+ const QHash<QString, QtAndroidPrivate::PermissionsResult> results =
+ QtAndroidPrivate::requestPermissionsSync(env, QStringList() << permission);
+ if (!results.contains(permission)
+ || results[permission] == QtAndroidPrivate::PermissionsResult::Denied)
+ {
+ qCWarning(QT_BT_ANDROID) << "Search not possible due to missing permission (ACCESS_COARSE_LOCATION)";
+ lastError = QBluetoothDeviceDiscoveryAgent::UnknownError;
+ errorString = QBluetoothDeviceDiscoveryAgent::tr("Missing Location permission. Search is not possible");
+ emit q->error(lastError);
+ return;
+ }
+ }
+
+ qCWarning(QT_BT_ANDROID) << "ACCESS_COARSE_LOCATION permission available";
+ }
+
// install Java BroadcastReceiver
if (!receiver) {
// SDP based device discovery