diff options
author | Alex Blasche <alexander.blasche@qt.io> | 2016-09-13 14:08:19 +0200 |
---|---|---|
committer | Alex Blasche <alexander.blasche@qt.io> | 2016-09-21 10:49:37 +0000 |
commit | d6fd07c9260f5a1411f8e6468182f1096344b146 (patch) | |
tree | 197ecc9fb034cbb88f68f706098eca671ed96fd9 /src | |
parent | 9d22c12fe4bc6b19c83aa6cf421b90dbeae5f045 (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>
Diffstat (limited to 'src')
-rw-r--r-- | src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp | 26 |
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 |