我每3分钟运行一次前台服务。因此,我的目标是:运行前台服务,获取当前用户位置,然后停止前台服务。 所以现在我用这个:
locationCallback = object : LocationCallback(){
override fun onLocationAvailability(locationAvailability: LocationAvailability?) {
super.onLocationAvailability(locationAvailability)
if(locationAvailability!!.isLocationAvailable){
fusedLocationClient.lastLocation.addOnSuccessListener { location: Location? ->
if (location != null) {
// do my action with this location and finish the foreground service
}
}
}else{
prepareFinishService() // finish service
}
}
}
fusedLocationClient.requestLocationUpdates(locationRequest,
locationCallback, Looper.getMainLooper())
我的locationRequest:
fun createLocationRequest(): LocationRequest {
val locationRequest = LocationRequest.create()
locationRequest.interval = 10000L * 10
locationRequest.fastestInterval = 50000L
locationRequest.smallestDisplacement = 10f
locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
return locationRequest
}
但是在这种解决方案中,我找不到新的位置。例如,用户更改位置,但是onLocationAvailability
重新运行先前的位置。经过一段时间(例如,在我的服务运行15分钟后),它将返回更新的位置。
我知道我也可以添加此回调:
override fun onLocationResult(locationResult: LocationResult?) {
// my action with location
}
但是根据文档: onLocationResult
“即使isLocationAvailable()返回true时,也可能不会始终定期调用onLocationResult(LocationResult),但是设备位置是已知的,并且根据提示,最近交付的位置和getLastLocation(GoogleApiClient)都将保持最新状态由活动的LocationRequests指定。”
可能不会调用此函数,并且我的服务将一直运行直到下一次启动。我不希望这种情况。有什么解决方案可以始终访问当前服务然后停止该服务?
答案 0 :(得分:0)
例如,用户更改位置但onLocationAvailability重新运行 以前的位置。
getLastLocation
就是这样做的。它返回 最新已知 位置,并不表示最新位置。根据文档:
它特别适合不需要精确位置的应用程序。
也就是说,为了获得不错的准确性,您应该使用requestLocationUpdates
。
但是,请勿手动启动/停止服务。如果要定期更新用户位置,只需设置正确的参数即可。
LocationRequest locationRequest = new LocationRequest();
locationRequest.setInterval(1000*60*3); // max: 3 min
locationRequest.setFastestInterval(1000*60*1); // min: 1 min
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);