Fix bluetooth permission checking for android <= 30 (11)

This commit is contained in:
Michael Zanetti 2022-12-09 15:28:18 +01:00
parent 2f2f5d94be
commit caab69af01
2 changed files with 22 additions and 4 deletions

View File

@ -3,12 +3,13 @@
#include <QApplication> #include <QApplication>
#include <QDebug> #include <QDebug>
#include <QAndroidIntent> #include <QAndroidIntent>
#include <QOperatingSystemVersion>
PlatformPermissionsAndroid * PlatformPermissionsAndroid::s_instance = nullptr; PlatformPermissionsAndroid * PlatformPermissionsAndroid::s_instance = nullptr;
#define FLAG_ACTIVITY_NEW_TASK 0x10000000 #define FLAG_ACTIVITY_NEW_TASK 0x10000000
QHash<PlatformPermissions::Permission, QStringList> permissionMap = { QHash<PlatformPermissions::Permission, QStringList> permissionMapV31 = {
// TODO: Once QtBluetooth does not request the COARSE_LOCATION and FINE_LOCATION for Bluetooth any more, remove it from here. The new Bluetooth permissions would be enough. // TODO: Once QtBluetooth does not request the COARSE_LOCATION and FINE_LOCATION for Bluetooth any more, remove it from here. The new Bluetooth permissions would be enough.
{PlatformPermissions::PermissionBluetooth, {"android.permission.BLUETOOTH_SCAN", "android.permission.BLUETOOTH_CONNECT", "android.permission.BLUETOOTH_ADVERTISE", "android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"}}, {PlatformPermissions::PermissionBluetooth, {"android.permission.BLUETOOTH_SCAN", "android.permission.BLUETOOTH_CONNECT", "android.permission.BLUETOOTH_ADVERTISE", "android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"}},
{PlatformPermissions::PermissionLocation, {"android.permission.ACCESS_FINE_LOCATION"}}, {PlatformPermissions::PermissionLocation, {"android.permission.ACCESS_FINE_LOCATION"}},
@ -16,6 +17,13 @@ QHash<PlatformPermissions::Permission, QStringList> permissionMap = {
{PlatformPermissions::PermissionNotifications, {"android.permission.POST_NOTIFICATIONS"}}, {PlatformPermissions::PermissionNotifications, {"android.permission.POST_NOTIFICATIONS"}},
}; };
QHash<PlatformPermissions::Permission, QStringList> permissionMapV30 = {
{PlatformPermissions::PermissionBluetooth, {"android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"}},
{PlatformPermissions::PermissionLocation, {"android.permission.ACCESS_FINE_LOCATION"}},
{PlatformPermissions::PermissionBackgroundLocation, {"android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_BACKGROUND_LOCATION"}},
{PlatformPermissions::PermissionNotifications, {"android.permission.POST_NOTIFICATIONS"}},
};
PlatformPermissionsAndroid::PlatformPermissionsAndroid(QObject *parent) PlatformPermissionsAndroid::PlatformPermissionsAndroid(QObject *parent)
: PlatformPermissions{parent} : PlatformPermissions{parent}
{ {
@ -35,8 +43,8 @@ PlatformPermissionsAndroid::PlatformPermissionsAndroid(QObject *parent)
void PlatformPermissionsAndroid::requestPermission(PlatformPermissions::Permission permission) void PlatformPermissionsAndroid::requestPermission(PlatformPermissions::Permission permission)
{ {
if (permissionMap.contains(permission)) { if (permissionMap().contains(permission)) {
QtAndroid::requestPermissions({permissionMap.value(permission)}, &permissionResultCallback); QtAndroid::requestPermissions({permissionMap().value(permission)}, &permissionResultCallback);
} }
} }
@ -51,10 +59,19 @@ void PlatformPermissionsAndroid::openPermissionSettings()
QtAndroid::androidContext().callMethod<void>("startActivity", "(Landroid/content/Intent;)V", intent.handle().object()); QtAndroid::androidContext().callMethod<void>("startActivity", "(Landroid/content/Intent;)V", intent.handle().object());
} }
QHash<PlatformPermissions::Permission, QStringList> PlatformPermissionsAndroid::permissionMap() const
{
QOperatingSystemVersion osVersion = QOperatingSystemVersion::current();
if (osVersion.majorVersion() <= 11) {
return permissionMapV30;
}
return permissionMapV31;
}
PlatformPermissions::PermissionStatus PlatformPermissionsAndroid::checkPermission(Permission permission) const PlatformPermissions::PermissionStatus PlatformPermissionsAndroid::checkPermission(Permission permission) const
{ {
PermissionStatus status = PermissionStatusGranted; PermissionStatus status = PermissionStatusGranted;
QStringList androidPermissions = permissionMap.value(permission); QStringList androidPermissions = permissionMap().value(permission);
foreach (const QString androidPermission, androidPermissions) { foreach (const QString androidPermission, androidPermissions) {
if (QtAndroid::shouldShowRequestPermissionRationale(androidPermission)) { if (QtAndroid::shouldShowRequestPermissionRationale(androidPermission)) {
return PermissionStatusDenied; return PermissionStatusDenied;

View File

@ -19,6 +19,7 @@ public:
signals: signals:
private: private:
QHash<PlatformPermissions::Permission, QStringList> permissionMap() const;
static PlatformPermissionsAndroid *s_instance; static PlatformPermissionsAndroid *s_instance;
static void permissionResultCallback(const QtAndroid::PermissionResultMap &results); static void permissionResultCallback(const QtAndroid::PermissionResultMap &results);