Fused Location Provider:有没有办法检查位置更新是不是失败?

Posted

技术标签:

【中文标题】Fused Location Provider:有没有办法检查位置更新是不是失败?【英文标题】:Fused Location Provider: Is there a way to check if a location update failed?Fused Location Provider:有没有办法检查位置更新是否失败? 【发布时间】:2016-06-20 06:00:42 【问题描述】:

简介

在我的应用中,我想一次性获得用户当前所在位置的准确位置。当我使用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

感谢阅读,请帮帮我。

【问题讨论】:

试过检查onSuccess()方法的status参数? 是的,toString 方法应该在失败时报告“StatusstatusCode=SUCCESS, resolution=null” 【参考方案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);

而不是使用LocationListener。我用LocationCallback

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

onLocationAvailablity 总是被调用。 locationAvailability.isLocationAvailable() 如果设备位置是已知的并且在活动 LocationRequests 请求的提示中合理地是最新的,则返回 true。如果由于多种原因(包括禁用的位置设置或无法检索设备环境中的传感器数据)而无法确定位置,则会返回 False。

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

其他人可以为此担保吗?

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

【讨论】:

你知道我花了整整 2 天的时间。我将尽可能多地分享这个答案。它应该被标记为接受答案。 @Ersen Osman 谢谢兄弟你救了我的命.....再次感谢你 有什么办法可以改善onLocationResult?一些连接不好的设备永远不会调用它。 另外onLocationAvailablity只被调用了2次,第一次返回True,第二次返回False,之后再也不会被调用。 你能告诉我你做了什么来删除所有现有的位置历史记录(以防止缓存位置)吗?

以上是关于Fused Location Provider:有没有办法检查位置更新是不是失败?的主要内容,如果未能解决你的问题,请参考以下文章

Android 的 Fused Location Provider 的 LocationRequest 优先级有啥区别?

Fused Location Provider 无故停止

使用 Fused Location Provider 查找位置源

Fused Location Provider - 获得高精度

使 Fused Location Provider LocationClient 更易于使用

从 Fused Location Provider 获取 GPS 或网络提供商