在前台服务中获取当前位置

时间:2018-08-18 10:21:33

标签: java android kotlin geolocation

我每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指定。”

可能不会调用此函数,并且我的服务将一直运行直到下一次启动。我不希望这种情况。有什么解决方案可以始终访问当前服务然后停止该服务?

1 个答案:

答案 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);