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

介绍

在我的应用中,我希望获得用户当前所在位置的一次性准确位置。当我使用时,有时这将是空或过时的位置,因为我发现这只是一个缓存的位置,并没有请求新的位置更新。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) {

 }

但是,如果位置更新失败,则不会调用此函数。

我尝试过什么

我看到有一个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

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


答案 1

在对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);

而不是使用 .我用过LocationListenerLocationCallback

onLocationResult仅调用以提供基于 的最新位置结果。如果无法提供位置,则不会调用它,并且在我的测试期间,当位置被禁用并且GPS在室内等使用时,则不会调用它。请致电以获取实际位置对象。LocationRequestresult.getLastLocation()

onLocationAvailablity始终被调用。 如果设备位置已知且在活动 LocationRequest 请求请求的提示内是相当最新的,则返回 true。当无法确定位置可能由多种原因导致时,包括禁用位置设置或无法在设备环境中检索传感器数据,则返回 False。locationAvailability.isLocationAvailable()

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

其他人可以为此担保吗?

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


答案 2

推荐