我正在构建一个GPS Android应用程序,该应用程序根据用户当前位置获得最近的地方。
这是我的应用程序所做的:
- 检查GPS或网络是否可用
- 如果两者都不可用,那么不要做任何事情。否则,我们首先检查GPS是否在那里,如果没有,我们再检查网络。
- 使用其中一个后,我们获得当前位置,然后将其发送到服务器。
- 一旦我们从服务器检索数据并更新UI,我们停止侦听进一步的位置更新。一次就足够了,直到他们按下刷新按钮重新开始。
我希望做什么:
-
如果GPS或网络无法检索位置,例如,2分钟,那么我们切换提供商。我们不希望用户等待太久。
-
如果能够同时使用两个提供者,然后从中获得最准确的结果,那就太好了。我看了一下http://developer.android.com/guide/topics/location/strategies.html,我看到了isBetterLocation方法。我如何在我的应用程序中集成这个方法?我不太明白该如何称呼,何时称呼,何地称呼。我假设isBetterLocation()要求我同时调用Network和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通常需要更长的时间才能知道你的位置,因为寻找和校准GPS卫星是一项艰巨的任务(需要找到至少 3颗正确对准的卫星)。在此基础上,添加最终阻碍信号的物体/环境。除非你在应用启动前/启动时启用GPS,否则等待是强制性的。在另一边,你得到一个细粒度的位置。
-
如果你只需要一个粗略的位置,使用网络是一个解决方案:它在几秒钟内返回数据。然而位置的精度取决于可用/使用的网络;我没有任何实际的例子,但我猜精度会有很大的变化。GPS将总是具有比网络更好的粒度定位。
理解没有预定义的选择。一切都取决于你的应用如何处理这些数据。
在向网络发出定位请求时使用GPS,如果没有GPS设备则返回到网络。然后选择:
- 第一个结果如果你只需要一个位置
- 如果你想要最精确的数据的首选结果
如果GPS或网络无法检索位置,例如,2分钟,然后我们切换提供商。我们不希望用户等待太久。
在这两种情况下,都不要设置回退计时器:在第一个提供者失败的情况下,你只会延长等待时间;所以两个请求同时进行,除非android API不允许异步位置请求。