Ionic 6 Capacitor项目Android 11调用GeoLocation返回位置不可用求助
Ionic Capacitor Android 11+ 定位失败解决方案
- 第一步:移除非必要的后台定位权限
如果你的应用仅在前台运行时需要获取定位,直接删除AndroidManifest.xml中的android.permission.ACCESS_BACKGROUND_LOCATION权限配置。Android 11及以上系统检测到应用同时申请前台+后台定位权限时,会直接驳回所有定位权限请求。 - 第二步:增加显式权限校验&分步申请逻辑
不要直接调用getCurrentPosition依赖系统自动触发权限申请,使用Capacitor官方Permissions API先校验、申请前台定位权限,权限申请通过后再调用定位接口。示例代码如下:
import { Geolocation } from '@capacitor/geolocation'; import { Permissions } from '@capacitor/permissions'; async ngOnInit(){ // 先校验定位权限 const permStatus = await Permissions.query({ name: 'geolocation' }); if (permStatus.state !== 'granted') { // 申请前台定位权限 const applyRes = await Permissions.request({ name: 'geolocation' }); if (applyRes.state !== 'granted') { console.log('定位权限被拒绝'); return; } } // 权限通过后再获取位置 try { const resp = await Geolocation.getCurrentPosition({ enableHighAccuracy: true }); this.latitude = resp.coords.latitude; this.longitude = resp.coords.longitude; this.options = { center: { lat: this.latitude, lng: this.longitude}, zoom: 17 }; } catch (error) { console.log('Error getting location', error); } }
- 第三步:确有后台定位需求的适配方案
如果你的应用确实需要后台定位能力,需要先完成前台定位权限申请,且用户已同意后,再单独触发后台定位权限申请,申请前需要明确向用户告知后台定位的使用场景,否则系统会直接驳回请求。 - 第四步:排查额外配置项
确认项目build.gradle中的targetSdkVersion如果>=31,需要确保申请定位权限时引导用户开启精确位置权限,也可以直接在真机的应用设置页查看当前应用的定位权限授予状态,确认是否是权限被系统拦截导致的问题。
内容的提问来源于stack exchange,提问作者JoeyD
相关产品推荐
相关产品推荐

