fusedLocationProviderClient.lastLocation.addOnSuccessListener始终为null

Jes*_*ral 7 android android-location

我刚刚更新了我的Location API以使用FusedLocationProviderClient,但是我遇到了这个问题,当我关闭并在GPS上时,我总是得到null位置:

val fusedLocationProviderClient =
                        LocationServices.getFusedLocationProviderClient(callingActivity)
            fusedLocationProviderClient.flushLocations()
            getLocationRequest()

            checkLocationSettings(callingActivity, turnOnGpsRequestCode, callback) {
                // Location settings successful
                fusedLocationProviderClient.lastLocation
                        .addOnSuccessListener(callingActivity) {
                            location ->
                            // Here location is always null
callback.onCallback(MenumyRadar.RadarStatus.SUCCESS, location)
                        }
                        .addOnFailureListener {
                            callback.onCallback(MenumyRadar.RadarStatus.ERROR_UNKNOWN, null)
                        }
            }
Run Code Online (Sandbox Code Playgroud)

直到我打开另一个使用位置的应用程序,如谷歌地图或优步,它才能工作.

我有一些线索感谢这个答案 FusedLocationApi.getLastLocation总是为null

谷歌的解释:

fusedLocationClient.lastLocation .addOnSuccessListener {location:Location? - > //找到最后一个位置.在某些罕见情况下,这可能为空.}

getLastLocation()方法返回一个Task,您可以使用该Task获取具有地理位置的纬度和经度坐标的Location对象.在以下情况下,location对象可能为null:

设备设置中的位置已关闭.即使先前检索过最后一个位置,结果也可能为null,因为禁用位置也会清除缓存.设备从未记录其位置,这可能是新设备或已恢复出厂设置的设备.设备上的Google Play服务已重新启动,并且在重新启动服务后,没有活动的融合位置提供程序客户端请求了位置.为避免这种情况,您可以创建一个新客户端并自行请求位置更新.有关更多信息,请参阅接收位置更新.

但它没有说明如何处理这个问题,我该怎么办?

Jes*_*ral 6

我找到了一个解决方案,这就是发生的情况,当位置为null时,这意味着位置缓存已清除,这是在关闭GPS时发生的,所以当我打开它时,没有最后一个位置可以得到,我所做的就是:

checkLocationSettings(callingActivity, turnOnGpsRequestCode, callback) {
                // Location settings successful
                mFusedLocationProviderClient!!.lastLocation
                        .addOnSuccessListener(callingActivity) {
                            location ->
                            if (location == null || location.accuracy > 100) {
                                mLocationCallback = object : LocationCallback() {
                                    override fun onLocationResult(locationResult: LocationResult?) {
                                        stopLocationUpdates()
                                        if (locationResult != null && locationResult.locations.isNotEmpty()) {
                                            val newLocation = locationResult.locations[0]
                                            callback.onCallback(Status.SUCCESS, newLocation)
                                        } else {
                                            callback.onCallback(Status.ERROR_LOCATION, null)
                                        }
                                    }
                                }

                                mFusedLocationProviderClient!!.requestLocationUpdates(getLocationRequest(),
                                        mLocationCallback, null)
                            } else {
                                callback.onCallback(Status.SUCCESS, location)
                            }
                        }
                        .addOnFailureListener {
                            callback.onCallback(Status.ERROR_UNKNOWN, null)
                        }
            }
Run Code Online (Sandbox Code Playgroud)

当位置为null时,开始使用回调和

mFusedLocationProviderClient !!。requestLocationUpdates(getLocationRequest(),mLocationCallback,null)

然后,当回调被调用时,将获得一个新位置,并再次开始获取位置。

有时会发生这样的情况,当您打开GPS时,位置不是零,但精度很差,因此我还要检查位置精度是否足够好(对我来说,足够好是100米)