我刚刚更新了我的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服务 设备已重新启动,并且没有活动的融合位置提供程序 服务重新启动后请求位置的客户端。至 避免这种情况,您可以创建一个新的客户端和请求位置 更新自己。有关更多信息,请参阅接收位置 更新。
但它没有说明如何处理这个问题,我该怎么办?
答案 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 ();
}