确定用户位置的难点
利用一个移动设置来获取用户位置可能有点复杂。有很多原因会导致定位到的位置(无论是哪种方式的定位)是错误或不精确的。一些引起用户位置错误的根源如下:
1、 多位置源。 GPS 、基站 ID 和 WIFI 都能为用户位置提供根据。确定使用和依赖哪一个信息源需要折衷考虑精度、速度和耗电情况。
2、 用户移动。因为用户位置一直在变,所以你必须频繁重新估算以记录用户的移动。
3、 多变的精度。来自于各种不同位置信息源的位置估算并没有一个连贯的精度。 10 秒前从一个信息源得到的位置可能比一个从另一信息源或同一信息得到的最新位置要精度。
这些问题会使得获取一个可依赖的用户位置显得非常困难。这个文档提供了一些信息帮助你去解决这些获取用户位置的这些难点。同时提供一些建议,让你能在你的程序中为用户提供一个精确、灵敏的地理定位体验。
请求位置更新
在讨论上面提到的定位错误之前,这里先介绍在 Android 中如何获取用户的位置。
在 Android 中获取用户位置是通过回调的方法。你可以通过调用 requestLocationUpdates() 并传递进一个 LocationListener 来指出你想要从 LocationManager 中收到的位置更新。你的 LocationListener 必须实现几个方法,这些方法是在用户位置改变或服务状态改变时被位置管理器( Location Manager )调用的。
下面给出如何定义一个 LocationListener 和请求位置的代码:
如果要通过 GPS 提供器请求用户位置更新就要用 GPS_PROVIDER 代替 NETWORK_PROVIDER 。你也可以通过调用两次 requestLocationUpdates() 并分别传入 NETWORK_PROVIDER 和 GPS_PROVIDER 来同时使用 GPS 和网络定位提供器请求位置更新。
请求用户权限
为了能从 NETWORK_PROVIDER 和 GPS_PROVIDER 接收到位置更新,你必须在 manifest 文件中定义 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION 权限来请求用户权限。代码如下:
如果没有申请这些权限,你的应用程序将无法在运行时请求位置更新。
注:如果你需要通过 NETWORK_PROVIDER 和 GPS_PROVIDER 两种方式同时定位,那么你只需要申请一个 ACCESS_FINE_LOCATION 权限就行,因为这个权限对于这两种定位方式都适应,而 ACCESS_COARSE_LOCATION 权限只是对于 NETWORK_PROVIDER 方式适应。
定义一个最佳执行模型
基于位置的应用程序目前已经相当普遍了,但由于缺乏最佳精度、用户移动、获取位置方式的多样性和节省电池等等原因,使得获取用户位置显得很复杂。在节省电池的情况下,为了克服获取一个准确用户位置的难点,你必须定义一个能指定你的应用程序如何获取用户位置的稳定模型。这个模型包括了何时开始和停止监听更新信息,以及何时使用获取到的位置数据。