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

15

介绍

我想在我的应用程序中获取用户当前位置的一次性准确信息。当我使用FusedLocationProviderApi.getLastLocation时,有时会返回空值或过时的位置信息,因为我发现这只是获取了缓存位置而没有请求新的位置更新。

解决方案是仅请求一次位置更新,如下所示。

 LocationRequest locationRequest  = LocationRequest.create()
                .setNumUpdates(1)
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                .setInterval(0);

        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,locationRequest,this)

现在,我每次都能获得更准确的位置。

我的问题

如何确定位置更新失败了?因为我只请求一次。

当获取位置更新时,会调用此回调函数。

 @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参数了吗? - Jyotman Singh
是的,当它失败时,toString方法会报告“Status {statusCode = SUCCESS,resolution = null}”。 - Ersen Osman
1个回答

34

在深入了解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);

我使用LocationCallback代替了LocationListener

onLocationResult仅基于LocationRequest提供最新的位置结果。如果无法提供位置,或者在我的测试中未启用位置且使用室内GPS等,则不会调用。请调用result.getLastLocation()以获取实际位置对象。

onLocationAvailablity始终被调用。locationAvailability.isLocationAvailable()如果设备已知位置并且在活动定位请求请求的提示范围内保持更新,则返回true。如果无法确定位置,则由多种原因导致错误,包括禁用位置设置或无法在设备环境中检索传感器数据,则返回false。

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

其他人能否证实这一点?

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


你知道吗,我为了这个问题花了整整两天的时间。我会尽可能分享这个答案。它应该被标记为接受答案。 - Subho
@Ersen Osman 谢谢你兄弟,你救了我的命......再次感谢你。 - Gowthaman M
1
有没有办法改进 onLocationResult?一些连接质量较差的设备永远不会调用它。 - paugoo
1
同时,onLocationAvailability 方法只被调用了两次,第一次返回 True,第二次返回 False,之后就再也没有被调用了。 - paugoo
2
你能告诉我你做了什么来清除所有现有的位置历史记录(以防止缓存位置)吗? - Joshua
我正在使用fusedLocationClient.requestLocationUpdates(new LocationRequest(), locationCallback, Looper.getMainLooper());。但即使我在行走,位置信息始终保持不变。您有任何想法吗? - Mohamad Mousheimish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接