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 Android的定位服务 - 图1

图 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对象,其中包含具体位置的经纬度信息、精度信息、高度信息、更新时间等。