11.1 Android的定位服务
定位服务,指的是通过获取移动设备上的GPS信息、基站信息、WiFi信息等与当前位置相关的信息,用来判断用户所处的具体位置,位置信息通常用经纬度来表示。
定位服务是整个地理信息服务的基础,精准地定位是其他位置服务的基础。为了保证能够提供精准的定位,Android提供了多种定位手段,使得设备能在各种环境下准确定位。
11.1.1 定位服务框架
Android的位置信息,是通过不同的位置信息源(Location Provider)来提供的,表示位置信息源的对象派生自android.provider.LocationProvider类。它们会通过硬件设备收集需要的信息,并将其换算成位置信息。
Android的位置信息服务(LocationProviderService),用来管理所有的位置信息源,并通过这些信息源向请求者提供当前的位置信息。和其他系统服务类似,Android的位置信息服务运行在系统核心进程的独立线程中,在服务初始化时,会根据配置信息实例化系统中预设的定位信息源对象(定位处理流程如图11-1)。
调用组件可以使用android.location.LocationManager对象来获取当前的位置信息:
//获得定位服务的客户端对象
LocationManager locationManager=
getSystemService(Context.LOCATION_SERVICE);
//读取最新的GPS定位信息
Location locationFromGps=
locationManager.getLastKnownLocation(
LocationManager.GPS_PROVIDER);
图 11-1 定位流程处理图
通过LocationManager.getLastKnownLocation函数应用可以获得最近一次系统进行定位时保存的信息。如果应用需要获得当前最新的位置信息,则要先请求更新并监听当前位置信息的变化:
…
//构造位置信息监听对象
LocationManager locationManager=(LocationManager)
getSystemService(Context.LOCATION_SERVICE);
LocationListener listener=new LocationListener(){
public void onLocationChanged(Location location){
updateLocation(location);
}
public void onStatusChanged(String provider,
int status, Bundle extras){}
public void onProviderEnabled(String provider){}
public void onProviderDisabled(String provider){}
};
//在onResume函数中更新并监听位置信息
protected void onResume(){
//更新并监听位置信息的变化
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,0,0,listener);
}
//在onPause函数中停止监听位置信息
protected void onPause(){
locationManager.removeUpdates(listener);
}
位置信息变更事件的监听,通常是在Activity.onResume函数中进行注册,而注销对该事件的监听,则是在与之对应的Activity.onPause函数中执行。位置信息的请求更新和停止更新需要对应出现,否则Android会不断刷新位置信息,耗费大量的电力,降低系统性能。
位置信息变更事件的注册需要调用LocationManager.requestLocationUpdates函数,在该函数的使用中,不要设定过短的触发距离及触发间隔,以节约系统开销。
当位置更新后,Android会回调事件监听对象的LocationListener.onLocationChanged函数,传入最新的位置信息。位置信息会被封装成android.location.Location对象,其中包含具体位置的经纬度信息、精度信息、高度信息、更新时间等。