From 0f8c2a879e8f53d4ef07bc3f2792242eac5670c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Tue, 9 Dec 2025 15:47:17 +0100 Subject: [PATCH] android: Update permissions for searching bluetooth devices --- .../android/platformpermissionsandroid.cpp | 55 ++++++++++++++++--- packaging/android/AndroidManifest.xml | 3 +- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/nymea-app/platformintegration/android/platformpermissionsandroid.cpp b/nymea-app/platformintegration/android/platformpermissionsandroid.cpp index 45fd8871..3146de52 100644 --- a/nymea-app/platformintegration/android/platformpermissionsandroid.cpp +++ b/nymea-app/platformintegration/android/platformpermissionsandroid.cpp @@ -90,6 +90,25 @@ PlatformPermissions::PermissionStatus PlatformPermissionsAndroid::checkPermissio status = PermissionStatusNotDetermined; break; } + + // Some Android/Qt stacks still gate BLE scans on location permission; ensure it is present alongside bluetooth. + if (status != PermissionStatusDenied) { + QLocationPermission locationPermission; + locationPermission.setAccuracy(QLocationPermission::Precise); + const auto locationStatus = qApp->checkPermission(locationPermission); + switch (locationStatus) { + case Qt::PermissionStatus::Granted: + break; + case Qt::PermissionStatus::Denied: + qCWarning(dcPlatformPermissions()) << "Location permission denied but required for bluetooth scanning."; + status = PermissionStatusDenied; + break; + case Qt::PermissionStatus::Undetermined: + qCDebug(dcPlatformPermissions()) << "Location permission not yet requested but required for bluetooth scanning."; + status = PermissionStatusNotDetermined; + break; + } + } break; } case PlatformPermissions::PermissionLocalNetwork: { @@ -194,24 +213,44 @@ PlatformPermissions::PermissionStatus PlatformPermissionsAndroid::checkPermissio void PlatformPermissionsAndroid::requestPermission(PlatformPermissions::Permission platformPermission) { switch (platformPermission) { - case PlatformPermissions::PermissionBluetooth: + case PlatformPermissions::PermissionBluetooth: { qCDebug(dcPlatformPermissions()) << "Requesting bluetooth permission"; { QBluetoothPermission permission; permission.setCommunicationModes(QBluetoothPermission::Access); qApp->requestPermission(permission, [platformPermission](const QPermission &permission) { - if (permission.status() == Qt::PermissionStatus::Denied) { - qCWarning(dcPlatformPermissions()) << "Bluetooth permission denied."; - s_instance->m_requestedButDeniedPermissions.append(platformPermission); - } + if (permission.status() == Qt::PermissionStatus::Denied) { + qCWarning(dcPlatformPermissions()) << "Bluetooth permission denied."; + s_instance->m_requestedButDeniedPermissions.append(platformPermission); + } - if (permission.status() == Qt::PermissionStatus::Granted) - qCDebug(dcPlatformPermissions()) << "Bluetooth permission granted."; + if (permission.status() == Qt::PermissionStatus::Granted) + qCDebug(dcPlatformPermissions()) << "Bluetooth permission granted."; - emit s_instance->bluetoothPermissionChanged(); + emit s_instance->bluetoothPermissionChanged(); + }); + } + + QLocationPermission locationPermission; + locationPermission.setAccuracy(QLocationPermission::Precise); + const auto locationStatus = qApp->checkPermission(locationPermission); + if (locationStatus != Qt::PermissionStatus::Granted) { + qCDebug(dcPlatformPermissions()) << "Requesting location permission needed for bluetooth scanning on this Android version."; + qApp->requestPermission(locationPermission, [platformPermission](const QPermission &permission) { + if (permission.status() == Qt::PermissionStatus::Denied) { + qCWarning(dcPlatformPermissions()) << "Location permission denied."; + s_instance->m_requestedButDeniedPermissions.append(platformPermission); + } + + if (permission.status() == Qt::PermissionStatus::Granted) + qCDebug(dcPlatformPermissions()) << "Location permission granted."; + + emit s_instance->locationPermissionChanged(); + emit s_instance->bluetoothPermissionChanged(); }); } break; + } case PlatformPermissions::PermissionLocation: { QLocationPermission locationPermission; locationPermission.setAccuracy(QLocationPermission::Precise); diff --git a/packaging/android/AndroidManifest.xml b/packaging/android/AndroidManifest.xml index 79c49837..c8f3b70e 100644 --- a/packaging/android/AndroidManifest.xml +++ b/packaging/android/AndroidManifest.xml @@ -8,7 +8,8 @@ - +