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服务已重新启动,并且在重新启动服务后,没有活动的融合位置提供程序客户端请求了位置.为避免这种情况,您可以创建一个新客户端并自行请求位置更新.有关更多信息,请参阅接收位置更新.
但它没有说明如何处理这个问题,我该怎么办?
我找到了一个解决方案,这就是发生的情况,当位置为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米)