Android应用中Google Maps Timeline与getLastLocation()的坐标差异问题
getLastLocation()的本质限制:这个方法仅返回系统缓存的最近一次成功获取的位置,不会主动触发新的定位请求。如果你的App没有主动发起位置更新操作,系统位置缓存不会被刷新,自然一直返回旧坐标。而Google Maps Timeline是持续主动发起定位请求,不断更新系统位置缓存,所以能获取到沿途的多个点位。
定位权限与精度配置差异:如果你的App仅申请了
ACCESS_COARSE_LOCATION粗定位权限,或者定位精度模式设置较低,系统会认为没有必要更新位置缓存;而Google Maps通常会申请ACCESS_FINE_LOCATION精确定位权限,且采用GPS、Wi-Fi、基站结合的高精度模式,更容易触发位置缓存的更新。后台定位权限与限制:若你的App在后台运行,Android的后台定位限制会大幅降低定位频率甚至停止位置更新。Google Maps作为系统级或被豁免的应用,能获得更宽松的后台定位权限,允许持续更新位置;但你的App可能未申请
ACCESS_BACKGROUND_LOCATION权限,或者未满足后台定位的系统要求(如没有在设置中开启后台定位权限)。位置更新机制不同:Google Maps会通过
FusedLocationProviderClient.requestLocationUpdates()主动监听位置变化,一旦位置发生变动就立即更新系统缓存;而你只是每分钟调用一次getLastLocation(),如果这一分钟内没有其他应用或系统操作触发位置更新,缓存就不会变化,自然拿不到新的坐标。电池优化的影响:系统的电池优化策略可能限制了你的App的定位行为,延迟或阻止了位置缓存的更新。Google Maps通常会被排除在电池优化之外,或者拥有专门的优化豁免,能够持续进行定位操作以更新位置。
内容的提问来源于stack exchange,提问作者iForests

