【问题标题】:Get current location in foreground service在前台服务中获取当前位置
【发布时间】:2018-08-18 10:21:32
【问题描述】:

我每 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())

还有我的位置请求:

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

这个函数可能不会被调用,我的服务会一直运行到下一次启动。我不想要这种情况。有什么办法可以一直访问当前服务然后停止服务?

【问题讨论】:

    标签: java android kotlin geolocation


    【解决方案1】:

    例如用户更改位置但 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);
    

    【讨论】:

    • 但是如果我想手动启动/停止服务,有没有更好的解决方案?我想手动启动/停止我的服务以节省电池。
    • 如果您想每 3 分钟获取一次更新,那么在 locationRequest 中设置正确的时间间隔不会比您发出请求然后反复调用 removeLocationUpdates 更浪费电池。
    • 当我在 requestLocationUpdates 之后没有调用 removeLocationUpdates 并且我关闭了我的服务时,它仍然请求位置更新吗?
    • Apparently yesThis call will keep the Google Play services connection active, so make sure to call removeLocationUpdates(LocationCallback) when you no longer need it.
    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    相关资源
    最近更新 更多