Android前台服务中onLocationChanged无法接收位置更新如何解决
位置更新无回调的排查方向
- 权限配置不符合系统要求
Android 10及以上版本,前台服务获取位置需要在Manifest中同时声明ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION以及ACCESS_FOREGROUND_SERVICE_LOCATION权限;运行时必须请求用户授予精确定位权限,仅授予粗略定位权限时GPS_PROVIDER的更新请求会被直接拦截。
如果你的targetSdkVersion >= 31,还需要在Manifest的Service标签中添加android:foregroundServiceType="location"属性,否则系统会拦截位置请求。 - GPS状态或场景不满足触发条件
你仅注册了GPS_PROVIDER的更新请求,如果用户设备GPS开关未开启,或是当前处于室内、地下等无GPS信号的场景,就不会触发位置回调。可以先通过locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)判断GPS状态,未开启时引导用户打开开关,也可以同时注册NETWORK_PROVIDER的位置更新做兜底。 - 监听对象生命周期异常
你当前把locationListener定义为onCreate方法内的局部变量,部分情况下系统可能回收监听引用导致回调失效,建议将locationListener改为Service类的全局成员变量。 - 位置API混用冲突
你的代码中同时初始化了Google的fusedLocationProviderClient和原生LocationManager,如果之前有调用过fusedLocation的位置配置逻辑,可能会和原生LocationManager的请求产生冲突,建议统一使用其中一套API实现位置请求。 - 厂商系统限制
国内多数定制Android系统会对后台应用做权限裁剪,即使你已经申请了所有基础权限,也需要引导用户手动开启「后台位置访问权限」「允许后台活动」「省电策略无限制」等开关,否则服务退到后台后会被系统拦截位置更新。
内容的提问来源于stack exchange,提问作者Enrico Cortinovis
相关产品推荐
相关产品推荐

