android - 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 客户端在服务重新启动后请求位置。为避免这种情况,您可以创建一个新客户端并自己请求位置更新。有关详细信息,请参阅接收位置更新。
但是它没有说如何处理这个,我该怎么办?
解决方案
我找到了一个解决方案,这就是发生的情况,当位置为空时,这意味着位置缓存已被清除,这发生在关闭 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米)
推荐阅读
- ruby - Ruby 的 %w 快捷方式的奇怪行为
- mysql - MySQL:将csv导入带引号的表中
- python-3.x - 如何在 TensorFlow 的 Object Detection API 中计算训练数据的评估指标?
- java - 如何保护 Java/Javafx 代码不被最终用户看到?
- html - 如何让我的第二个按钮具有 onclick 功能
- python - html模板到带有图像的pdf
- mysql - 如何过滤相对于某个日期时间的 SQL 表?
- ios - 如何检测 iOS 用户是否连接到蜂窝网络而不是 Wi-Fi?
- python - Python,Keras - ValueError:无法为具有形状“(?,?)”的张量u'dense_2_target:0'提供形状(10、70、1025)的值
- pandas - 合并/合并具有不同索引和不同列名的 DataFrame