Qt 6.4.1 for Android如何通过ACCESS_COARSE_LOCATION实现定位?
解决Qt 6.4.1中使用ACCESS_COARSE_LOCATION获取Android定位的问题
问题描述
使用Qt 6.4.1开发Android应用时,原代码通过申请ACCESS_FINE_LOCATION权限可正常实现GPS定位,但将权限替换为ACCESS_COARSE_LOCATION(符合应用需求)后,出现错误:
W qt.positioning.android: : Position data not available due to missing permission 4
且用户仅授权ACCESS_COARSE_LOCATION时,原代码也无法工作。
解决步骤
1. 配置AndroidManifest.xml权限声明
在项目的AndroidManifest.xml文件中添加ACCESS_COARSE_LOCATION权限声明:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
注:若应用针对Android 10(API 29)及以上版本且需要后台定位,需额外添加
ACCESS_BACKGROUND_LOCATION权限,前台定位无需此权限。
2. 修改定位逻辑代码
原问题核心是Qt定位模块默认优先尝试卫星定位(需ACCESS_FINE_LOCATION权限),仅持有ACCESS_COARSE_LOCATION时,必须明确指定使用非卫星定位方式(如基站、WiFi定位)。修改后的代码如下:
#include <QtAndroidPrivate> #include <QGeoPositionInfoSource> // 申请粗定位权限 auto permissionGPS = QtAndroidPrivate::requestPermission("android.permission.ACCESS_COARSE_LOCATION").result(); if(permissionGPS == QtAndroidPrivate::Authorized){ source = QGeoPositionInfoSource::createDefaultSource(nullptr); if (source) { // 指定使用非卫星定位方式,适配COARSE权限要求 source->setPreferredPositioningMethods(QGeoPositionInfoSource::NonSatellitePositioningMethods); auto last = source->lastKnownPosition(false); if(last.isValid()){ receivePosition(last); }else{ connect(source, &QGeoPositionInfoSource::positionUpdated, this, &Locator::receivePosition); source->startUpdates(); } } }else{ emit GPSRefusal(false); }
关键说明
setPreferredPositioningMethods(QGeoPositionInfoSource::NonSatellitePositioningMethods):强制定位源使用基站或WiFi定位,这类方式仅需ACCESS_COARSE_LOCATION权限即可正常运行。- 若需兼容
ACCESS_FINE_LOCATION权限(用户可能授权高精度权限),可扩展权限检查逻辑,根据实际授权的权限类型,动态设置对应的定位方式。
内容的提问来源于stack exchange,提问作者Cthurier
相关产品推荐
相关产品推荐

