Java 融合位置提供程序:是否有方法检查位置更新是否失败?
导言 在我的应用程序中,我想获得用户当前所在位置的一次性准确位置。当我使用Java 融合位置提供程序:是否有方法检查位置更新是否失败?,java,android,google-maps,fusedlocationproviderapi,Java,Android,Google Maps,Fusedlocationproviderapi,导言 在我的应用程序中,我想获得用户当前所在位置的一次性准确位置。当我使用FusedLocationProviderApi.getLastLocation时,有时这会是空的或过期的位置,因为我发现它只获取缓存位置,而不请求新位置更新 解决方案是只请求一次位置更新,如下所示 LocationRequest locationRequest = LocationRequest.create() .setNumUpdates(1) .s
FusedLocationProviderApi.getLastLocation
时,有时这会是空的或过期的位置,因为我发现它只获取缓存位置,而不请求新位置更新
解决方案是只请求一次位置更新,如下所示
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) {
}
但是,如果位置更新失败,则不会调用此函数
我尝试过的
我看到有一个结果回调。然而,即使一次性的位置更新失败,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);
}
});
LocationServices.FusedLocationApi.requestLocationUpdates(mgoogleapClient,locationRequest,this).setResultCallback(new ResultCallbacks()){
@凌驾
成功时公共无效(@NonNull状态){
DebugUtils.log(“requestLocationUpdates ResultCallback onSuccess+”+status.toString(),true,true);
}
@凌驾
public void onFailure(@NonNull状态){
DebugUtils.log(“requestLocationUpdatesResultCallbackonFailure+”+status.toString(),true,true);
}
});
其他
使用com.google.android.gms:play服务位置:8.4.0
感谢阅读,请帮助我。在深入了解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()
,以获取实际的位置对象
始终调用onLocationAvailabilitylocationAvailability.isLocationAvailable()
如果设备位置已知并且在活动LocationRequests请求的提示内合理地处于最新状态,则返回true。当无法确定位置可能是由于多种原因造成的,包括禁用位置设置或无法在设备环境中检索传感器数据时,返回False
我在没有定位服务的情况下进行了测试,只在室内使用GPS。在每种情况下,我都删除了所有现有的位置历史记录(以防止缓存位置)。始终返回准确的最新位置
其他人能证明这一点吗
注意:
requestLocationUpdates
调用的最后一个参数是活套。传入null意味着它将使用调用线程的消息队列 尝试检查onSuccess()
方法的status
参数?是的,toString方法在失败时报告“status{statusCode=SUCCESS,resolution=null}”。您知道这方面的一些信息,我花了整整两天的时间。我将尽可能多地分享这个答案。它应该被标记为接受答案。@Ersen Osman感谢兄弟你救了我的命。……再次感谢你一次有什么办法可以提高定位结果吗?某些连接不良的设备将永远不会调用它。此外,OnLocationAvailability仅被调用2次,第一次返回True,第二次返回False,然后再也不会被调用。您能告诉我如何删除所有现有位置历史记录(以防止缓存位置)?