android: Update permissions for searching bluetooth devices

This commit is contained in:
Simon Stürz 2025-12-09 15:47:17 +01:00
parent 871e2c0ce8
commit 0f8c2a879e
2 changed files with 49 additions and 9 deletions

View File

@ -90,6 +90,25 @@ PlatformPermissions::PermissionStatus PlatformPermissionsAndroid::checkPermissio
status = PermissionStatusNotDetermined; status = PermissionStatusNotDetermined;
break; 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; break;
} }
case PlatformPermissions::PermissionLocalNetwork: { case PlatformPermissions::PermissionLocalNetwork: {
@ -194,24 +213,44 @@ PlatformPermissions::PermissionStatus PlatformPermissionsAndroid::checkPermissio
void PlatformPermissionsAndroid::requestPermission(PlatformPermissions::Permission platformPermission) void PlatformPermissionsAndroid::requestPermission(PlatformPermissions::Permission platformPermission)
{ {
switch (platformPermission) { switch (platformPermission) {
case PlatformPermissions::PermissionBluetooth: case PlatformPermissions::PermissionBluetooth: {
qCDebug(dcPlatformPermissions()) << "Requesting bluetooth permission"; qCDebug(dcPlatformPermissions()) << "Requesting bluetooth permission";
{ {
QBluetoothPermission permission; QBluetoothPermission permission;
permission.setCommunicationModes(QBluetoothPermission::Access); permission.setCommunicationModes(QBluetoothPermission::Access);
qApp->requestPermission(permission, [platformPermission](const QPermission &permission) { qApp->requestPermission(permission, [platformPermission](const QPermission &permission) {
if (permission.status() == Qt::PermissionStatus::Denied) { if (permission.status() == Qt::PermissionStatus::Denied) {
qCWarning(dcPlatformPermissions()) << "Bluetooth permission denied."; qCWarning(dcPlatformPermissions()) << "Bluetooth permission denied.";
s_instance->m_requestedButDeniedPermissions.append(platformPermission); s_instance->m_requestedButDeniedPermissions.append(platformPermission);
} }
if (permission.status() == Qt::PermissionStatus::Granted) if (permission.status() == Qt::PermissionStatus::Granted)
qCDebug(dcPlatformPermissions()) << "Bluetooth permission 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; break;
}
case PlatformPermissions::PermissionLocation: { case PlatformPermissions::PermissionLocation: {
QLocationPermission locationPermission; QLocationPermission locationPermission;
locationPermission.setAccuracy(QLocationPermission::Precise); locationPermission.setAccuracy(QLocationPermission::Precise);

View File

@ -8,7 +8,8 @@
<uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.NFC" /> <uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />