首页 > 解决方案 > fusedLocationProviderClient.lastLocation.addOnSuccessListener 始终为空

问题描述

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

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)
                        }
            }

在我打开另一个使用位置的应用程序(如谷歌地图或优步)之前,它不起作用。

感谢这个答案,我有一些线索 FusedLocationApi.getLastLocation always null

而对于谷歌的解释:

fusedLocationClient.lastLocation .addOnSuccessListener { 位置:位置?-> // 获得最后一个已知位置。在极少数情况下,这可能为空。}

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

位置在设备设置中已关闭。即使先前检索到最后一个位置,结果也可能为空,因为禁用位置也会清除缓存。该设备从未记录其位置,这可能是新设备或已恢复出厂设置的设备的情况。设备上的 Google Play 服务已重新启动,并且没有活动的 Fused Location Provider 客户端在服务重新启动后请求位置。为避免这种情况,您可以创建一个新客户端并自己请求位置更新。有关详细信息,请参阅接收位置更新。

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

标签: androidandroid-location

解决方案


我找到了一个解决方案,这就是发生的情况,当位置为空时,这意味着位置缓存已被清除,这发生在关闭 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)
                        }
            }

当位置为空时,开始使用回调请求位置并

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

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

有时会出现打开GPS时,位置不为空但精度不好,所以我也检查位置精度是否足够好(对我来说足够好是100米)


推荐阅读