fusedLocationProviderClient.lastLocation.addOnSuccessListener始终为null

时间:2018-04-26 16:25:07

标签: 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)
                        }
            }

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

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

谷歌的解释:

  

fusedLocationClient.lastLocation           .addOnSuccessListener {    位置:位置? - >               //得到了最后的位置。在某些罕见情况下,这可能为空。    }

     

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

     

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

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

您可以在FusedLocationPrivedClient对象上使用getLocationAvailability()方法,如果返回true,则只能使用getLastLocation()方法,否则请使用requestLocationUpdates()方法:

FusedLocationProviderClient fusedLocationProviderClient =
            LocationServices.getFusedLocationProviderClient(InitActivity.this);
    if (ActivityCompat.checkSelfPermission(this.getApplicationContext(),
            android.Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {

fusedLocationProviderClient.getLocationAvailability().addOnSuccessListener(new OnSuccessListener<LocationAvailability>() {
                @Override
                public void onSuccess(LocationAvailability locationAvailability) {
                    Log.d(TAG, "onSuccess: locationAvailability.isLocationAvailable " + locationAvailability.isLocationAvailable());
                    if (locationAvailability.isLocationAvailable()) {
                        if (ActivityCompat.checkSelfPermission(InitActivity.this.getApplicationContext(),
                                android.Manifest.permission.ACCESS_FINE_LOCATION)
                                == PackageManager.PERMISSION_GRANTED) {
                            Task<Location> locationTask = fusedLocationProviderClient.getLastLocation();
                            locationTask.addOnCompleteListener(new OnCompleteListener<Location>() {
                                @Override
                                public void onComplete(@NonNull Task<Location> task) {
                                    Location location = task.getResult();                                    
                                }
                            });
                        } else {
                            requestLocationPermissions ();
                        }

                    } else {
fusedLocationProviderClient.requestLocationUpdates(locationRequest, pendingIntent);

                    }

                }
            });
        } else {
            requestLocationPermissions ();
        }