如何阻止用户等待很长时间才能获得位置修复?

Posted

技术标签:

【中文标题】如何阻止用户等待很长时间才能获得位置修复?【英文标题】:How do I stop the user waiting for a long time to get a location fix? 【发布时间】:2013-02-25 01:31:13 【问题描述】:

我正在构建一个 GPS android 应用程序,它可以根据用户的当前位置获取最近的地点。

这是我的应用程序所做的:

检查 GPS 或网络是否可用 如果两者都不可用,则不要执行任何操作。否则,我们首先检查 GPS 是否存在,如果没有,则检查网络。 使用其中一个后,我们获取当前位置,然后将其发送到服务器。 从服务器检索数据并更新 UI 后,我们将停止侦听进一步的位置更新。一次就足够了,直到他们按下刷新按钮再次开始。

我希望做什么:

如果 GPS 或网络未能检索到位置(例如 2 分钟),则我们会切换提供商。我们不希望用户等待太久。

如果能够同时使用这两个提供程序,然后从中获得最准确的结果,那也太好了。我查看了http://developer.android.com/guide/topics/location/strategies.html 并看到了 isBetterLocation 方法。我将如何将此方法集成到我的应用程序中?我无法理解应该如何、在何处以及何时调用它。我假设 isBetterLocation() 要求我同时调用网络和 GPS。对于我的应用程序来说,听听两者的准确性会很好。我该怎么做呢?如果其中一个不可用怎么办?

这是我的部分代码:

if(!GPSEnabled && !networkEnabled)

    Toast.makeText(this, "Error: This application requires a GPS or network connection",
            Toast.LENGTH_SHORT).show();

else

    if(GPSEnabled)
    
        locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
    
    else if(networkEnabled)
    
        System.out.println("Getting updates from network provider");
        locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
    

这是onLocationChanged 方法。我得到 lat/lng 值,然后将它们发送到我的服务器,然后用它做适当的事情。

public void onLocationChanged(Location location)

    //Get coordinates
    double lat = (location.getLatitude());
    double lng = (location.getLongitude());
    Log.d("MainActivity", "got location: " + lat + ": " + lng);
    //get nearest locations
    new GetLocations().execute(SharedVariables.root + SharedVariables.locationsController + SharedVariables.getNearestMethod + lat + "/" + lng); 

    // Zoom in, animating the camera after the markers have been placed
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), 10));
    System.out.println("lat = " + lat + ", lng = " + lng);

     //Stop listening for updates. We only want to do this once. 
     locManager.removeUpdates(this);

【问题讨论】:

你看过这个吗?:android-developers.blogspot.com/2011/06/…。还有 protips 示例应用程序?:code.google.com/p/android-protips-location 网络提供商不准确,但不到一秒就返回位置 嗨,雷诺,谢谢。我了解 GPS 和网络在准确性和速度方面有所不同,这让我想到了一个问题,我如何实现一项功能,如果有任何一个提供商可用,我会根据其中一个提供商获得位置,最好是 GPS,因为它是最准确的,那么如果在 x 时间后未找到修复程序,我会尝试切换到网络提供商(如果已打开)。 【参考方案1】:

无论是使用 GPS 还是网络,您都无法大幅减少获取位置的最终等待时间。

这两种定位方式各有优缺点:

GPS 通常需要较长时间才能知道您的位置,因为查找和校准 GPS 卫星是一项艰巨的任务(需要找到至少 3 颗正确对齐的卫星)。最重要的是,添加最终阻碍信号的物体/环境。除非您在应用启动之前/启动时启用 GPS,否则必须等待。 另一方面,您会得到一个细粒度的位置。

如果您只需要一个粗略的位置,使用网络是一种解决方案:它会在几秒钟内返回数据。 但是位置的精确度因可用/使用的网络而异;我没有任何实际的例子,但我猜精度可能会很大变化。 GPS 将总是拥有比网络更好的位置。

了解没有预定义的选择。任何事情都取决于您的应用如何处理这些数据。

在向网络发出位置请求时使用 GPS(如果可用),如果没有 GPS 设备,则回退到网络。然后采取:

如果您只需要一个位置,那么先来的结果 如果您想要最精确的数据,首选结果

如果 GPS 或网络未能检索到位置(例如 2 分钟),则我们会切换提供商。我们不希望用户等待太久。

在这两种情况下,都不要设置备用计时器:您只会在第一个提供程序失败的情况下延长等待时间;所以同时请求两个请求,除非 android API 不允许异步位置请求。

【讨论】:

谢谢。正如我之前在回复 Reno 的评论时所说,我了解 GPS 和网络提供商之间的区别。正如我们在我的问题和您对同时使用这两个请求的回答中都提到的那样,我想知道这将如何实现。当我们使用两个提供商时,我们如何选择最准确的位置?而且,在我的问题的最后一部分,如果其中一个提供者未启用,我们该怎么办? 正如我所说,GPS 将始终具有最佳精度。但除非您了解网络的精确度(通过请求其精度;或在 GPS 也可用时缓存此特定网络的精度(在 2 个提供商之间产生差异)),否则无法确定应该由哪个提供商被选中。可以平均不同位置提供者的值吗?

以上是关于如何阻止用户等待很长时间才能获得位置修复?的主要内容,如果未能解决你的问题,请参考以下文章

Google Maps setMyLocationEnabled(true) 需要很长时间才能显示当前位置

Excel 等待很长时间才能开始保存文档

Fetch在等待很长时间时给出空响应

构建需要很长时间才能响应的 API 的最佳实践是啥?

Android Locationprovider 需要很长时间才能暂时不可用

角度Web应用程序需要很长时间才能加载