融合位置提供商:有没有办法检查位置更新是否失败?

介绍

在我的应用程序中,我希望获得用户当前所在位置的一次性准确位置。 当我使用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() { @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

感谢您的阅读,请帮帮我。

在进一步挖掘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提供最新的Location结果。 如果无法提供位置,则不会调用它。在我的测试期间,当位置被禁用且GPS在室内使用时不会被调用。请调用result.getLastLocation()以获取实际的位置对象。

始终调用onLocationAvailablitylocationAvailability.isLocationAvailable()如果设备位置已知并且在活动LocationRequests请求的提示内合理更新,则返回true。 如果无法确定位置可能来自多种原因(包括禁用的位置设置或无法在设备环境中检索传感器数据),则会返回False。

我测试过没有位置服务,只在室内使用GPS。 在每种情况下,我都删除了所有现有的位置历史记录(以防止缓存的位置)。 始终返回准确的最新位置。

其他人可以保证这个吗?

注意: requestLocationUpdates调用的最后一个参数是looper。 传入null意味着它将使用调用线程的消息队列。

Interesting Posts