Vivo Android11设备调用GetPositionAsync抛出TaskCancelException求助
问题根因
该异常是Android 11系统+Vivo定制系统的位置策略限制导致的:
- Android 11对第三方应用调用Google Play服务的融合定位(FusedLocationProvider)做了权限收紧,Vivo V2050搭载的Funtouch OS在此基础上额外增加了无网状态下的定位拦截规则,非Google系应用默认无法在无网时主动触发Google定位服务更新
- 你观测到的「联网打开Google地图后APP可正常定位」,本质是Google地图联网时触发了Google Play服务的位置缓存更新,第三方应用才能读取到已缓存的位置信息
- CrossGeolocator底层默认优先调用Google融合定位接口,当定位请求超过设置的10s超时还未拿到结果时,就会抛出
TaskCanceledException异常
修复方案
1. 修正现有代码的错误并调整调用参数
你当前的代码存在两个可优化点:一是timeoutMillseconds拼写错误(正确拼写为timeoutMilliseconds),二是long是C#关键字不可用作变量名,同时可增加定位前置检查、允许返回最后已知位置来提升成功率,修改后的代码参考如下:
try { var locator = CrossGeolocator.Current; // 前置检查定位服务是否可用、已开启 if (!await locator.IsGeolocationAvailable() || !await locator.IsGeolocationEnabled()) { // 此处补充引导用户开启定位服务的交互逻辑 return; } // 调整定位参数:延长超时到15s适配定制系统、允许返回最近缓存的位置、调整精度要求 var position = await locator.GetPositionAsync( timeout: TimeSpan.FromSeconds(15), includeLastKnownLocation: true, accuracy: GeolocationAccuracy.Medium); var longitude = position.Longitude; } catch (TaskCanceledException ex) { // 捕获超时异常时触发降级定位逻辑 }
2. 补充Android 11权限配置
在Android项目的AndroidManifest.xml中添加对应位置权限声明:
<!-- 基础定位权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- Android 11及以上后台定位权限,如有后台定位需求可添加 --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
同时在申请权限时引导Vivo用户给应用授予「始终允许位置访问」权限,避免仅授予使用时权限导致后台定位请求被拦截。
3. 增加Vivo设备特殊适配
Vivo系统默认会对非白名单应用做电池优化限制,可在首次启动时引导用户关闭对当前应用的电池优化,同时允许Google Play服务后台运行,避免定位请求被系统主动杀死触发超时。
4. 补充降级定位策略
如果Google融合定位持续调用失败,可以切换调用Android原生LocationManager接口直接获取GPS/基站定位信息,绕过Google Play服务的依赖,适配无Google服务或者Google服务被限制的设备。
内容的提问来源于stack exchange,提问作者Hannah.C
相关产品推荐
相关产品推荐

