11.1.2 位置信息源
在Android中,具体的定位服务依托于多个不同的位置信息源,每个位置信息源对象都在独立的线程中运行。它与位置信息服务之间通过Socket连接进行通信,并传递位置信息。
最基本的位置信息源,是依托GPS信息来确定设备的位置(GpsLocationProvider)的。GPS信息的获取,需要有硬件设备和底层驱动的支持[1]。基于GPS信息的定位,精度非常高,通常在几十米到几米内;但GPS定位不仅受硬件设备的约束,而且抗干扰性也非常差,一旦移动设备受到建筑物的阻挡,可获取的信号强度将急剧下降,从而无法进行有效地定位。
因此,Android还提供了一种全新的位置信息源,它的定位方式称为基于网络的定位(Network Location)。该定位信息源对象会收集移动设备周边的WiFi和基站信息,并通过网络发送至Google的定位服务。Google服务会根据收集来的海量WiFi地址、基站地址与经纬度的对应关系,计算出设备当前的位置信息并返回给请求者。
由于基站或WiFi信号很容易受到干扰,无法通过信号强弱准确判定出具体位置,所以,基于网络的定位精度通常略低一些,大约在几十米至一百米的范围内。但通过网络的定位不依赖额外的硬件设备(仅需要连接网络),也不受建筑物遮挡的影响,其可用范围更为广阔。
定位信息涉及用户的隐私,默认情况下,有不少Android用户会选择停用所有的定位信息源。因此,如果应用非常依赖定位服务,则需要使用android.provider.Settings类来弹出设置页面,请求用户修改定位的隐私设置:
Intent intent=new Intent(
Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
Android系统所提供的位置信息源都是在操作系统底层预先配置完成的,开发者无法进行动态扩展。如果开发者期望使用自定义的位置信息源进行定位,就不能基于该框架进行开发,而只能另辟蹊径了。
[1]GPS驱动的实现,可以参考http://source.android.com/porting/gps.html提供的接口文档。