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

Android 如何阻止用户等待很长时间才能获得位置修复?,android,gps,location,locationmanager,location-provider,Android,Gps,Location,Locationmanager,Location Provider,我正在构建一个GPS Android应用程序,根据用户的当前位置获取最近的位置 我的应用程序就是这样做的: 检查GPS或网络是否可用 如果两者都不可用,则不要做任何事情。否则,我们首先检查是否有GPS,如果没有,然后检查网络 使用其中一个后,我们获取当前位置,然后将其发送到服务器 一旦我们从服务器检索数据并更新UI,我们将停止侦听进一步的位置更新。一次就足够了,直到他们按下刷新按钮再次启动 我希望做的是: 如果GPS或网络无法检索位置,例如2分钟,则我们将切换提供商。我们不希望用户等待太久

我正在构建一个GPS Android应用程序,根据用户的当前位置获取最近的位置

我的应用程序就是这样做的:

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

  • 如果GPS或网络无法检索位置,例如2分钟,则我们将切换提供商。我们不希望用户等待太久

  • 如果能够同时使用这两个提供者,并从中获得最准确的结果,那将是一件好事。我已经看过了,我看到了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);
}

无论是使用全球定位系统还是网络,你都无法大幅减少获取位置的最终等待时间

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

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

  • 如果您只需要一个粗略的位置,那么使用网络是一个解决方案:它会在几秒钟内返回数据但是位置的精度取决于可用/使用的网络;我没有任何实际的例子,但我想精度可能会有很大的差异。GPS总是比网络具有更好的粒度位置

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

使用GPS(如果可用),同时向网络发出定位请求,如果没有GPS设备,则返回网络。然后采取以下措施之一:

  • 如果你只需要一个位置,第一个结果就会出现
  • 如果需要最精确的数据,则首选结果
如果GPS或网络无法检索位置,例如2分钟,则我们将切换提供商。我们不希望用户等待太久


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

您看到了吗?:。还有protips示例应用程序?:网络提供商不准确,但它在不到一秒钟的时间内返回了位置Hi Reno,谢谢。我了解GPS和网络在精度和速度方面存在差异,这就引出了我的问题,我如何实现一个功能,即如果任一提供商可用,我将根据其中一个提供商获取位置,最好是GPS,因为它是最精确的,如果在x时间段后未找到定位,我尝试切换到网络供应商,如果它是打开的。谢谢。正如我之前在回复雷诺评论时所说,我理解GPS和网络提供商之间的区别。正如我们在我的问题和你的回答中提到的,关于同时使用这两个请求,我想知道这将如何实现。当我们使用两个提供商时,如何选择最准确的位置?另外,在我问题的最后一部分,如果其中一个提供商未启用,我们该怎么办?正如我所说,GPS将始终具有最佳精度。但是,除非您知道网络的精度(通过请求其精度;或在GPS也可用时缓存此特定网络的精度(使两个提供商之间存在差异)),否则无法确定应选择哪个提供商。可能会平均不同位置提供者的值?