简介
在我的应用中,我希望获得用户当前所在位置的一次性准确位置。当我使用FusedLocationProviderApi.getLastLocation
时有时这将是null或过时的位置,因为我发现这只是获取缓存的位置而不会请求新的位置更新。
解决方案是仅请求位置更新一次,如下所示。
LocationRequest locationRequest = LocationRequest.create()
.setNumUpdates(1)
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(0);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,locationRequest,this)
现在我的位置越来越准确了。
我的问题
如何确定位置更新是否失败?因为我只要求1.
获取位置更新后,将调用此回调
@Override
public void onLocationChanged(Location location) {
}
但是,如果位置更新失败,则不会调用此方法。
我尝试了什么
我看到有一个ResultCallback。但是,即使一次性位置更新失败,也始终会调用onSuccess。
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,locationRequest,this).setResultCallback(new ResultCallbacks<Status>() {
@Override
public void onSuccess(@NonNull Status status) {
DebugUtils.log("requestLocationUpdates ResultCallback onSuccess + " + status.toString(),true,true);
}
@Override
public void onFailure(@NonNull Status status) {
DebugUtils.log("requestLocationUpdates ResultCallback onFailure + " + status.toString(),true,true);
}
});
其他
使用com.google.android.gms:play-services-location:8.4.0
感谢您的阅读,请帮助我。
答案 0 :(得分:25)
在对API进行更多挖掘并进行一些测试之后,我找到了解决我的问题的解决方案,这似乎有效。
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, locationRequest, new LocationCallback() {
@Override
public void onLocationResult(LocationResult result) {
DebugUtils.log("onLocationResult");
}
@Override
public void onLocationAvailability(LocationAvailability locationAvailability) {
DebugUtils.log("onLocationAvailability: isLocationAvailable = " + locationAvailability.isLocationAvailable());
}
}, null);
而不是使用LocationListener
。我使用了LocationCallback
onLocationResult
仅会根据LocationRequest
提供最新的位置结果。如果无法提供位置,则不会调用它。在我的测试期间,当位置被禁用且GPS在室内使用时不会被调用。请致电result.getLastLocation()
以获取实际的位置对象。
onLocationAvailablity
。 locationAvailability.isLocationAvailable()
如果设备位置已知并且在活动LocationRequests请求的提示内合理更新,则返回true。当未能确定位置可能来自多个原因(包括禁用的位置设置或无法在设备环境中检索传感器数据)时返回错误。
我测试过没有定位服务,仅在室内使用GPS。在每种情况下,我都删除了所有现有的位置历史记录(以防止缓存的位置)。始终返回准确的最新位置。
其他人可以担保吗?
注意:requestLocationUpdates
调用的最后一个参数是looper。传入null意味着它将使用调用线程的消息队列。