You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:05:50