11.1.3 定位选择

既然Android提供了多个位置信息源,那对于开发者而言,该如何选择位置信息源进行定位呢?常用的策略有两种,其中一种策略是依照预设的标准,从众多定位信息源中选择一个最符合标准的提供定位。

利用LocationManager.getBestProvider函数,可以用来选择位置信息源:


LocationManager locationManager=(LocationManager)

getSystemService(Context.LOCATION_SERVICE);

String providerName=locationManager.getBestProvider(

new Criteria(),true);

LocationProvider provider=locationManager.getProvider(

providerName);


其中,android.location.Criteria对象用来描述位置信息源选择的依据,其中包括定位精度范围、电力要求、是否提供速度信息等。开发者可以通过Criteria类提供的接口,构造Criteria对象,自定义选择标准。

Criteria类中提供的选择依据都是静态的,只和该位置信息源的基本特征相关,并不考虑其在当前环境下实际运行的状况。这就使得选择出来的位置信息源不一定能准确地提供位置信息。比如,按照静态标准,GPS位置信息源的精度通常优于网络位置信息源;但如果移动设备位于室内,受到建筑物的遮挡,其实际定位效果常弱于网络位置信息源。

而另一种定位信息源选择策略,是根据所有的位置信息源的真实运行状态,动态地对定位信息进行选择。

比如,通过比较定位信息android.location.Location对象的时间、精度、间隔等,可以判断出哪个位置信息源提供的定位信息更合理。开发者可以根据自己的需求撰写合适的算法,一个算法示例如下:


//该函数用来判断,是否需要使用新获得的定位信息来取代老的

public boolean needChangeLocation(Location newLocation){

//确定新的定位信息获得的时间更晚

if(newLocation.getTime()<oldLocation.getTime()){

return false;

}

//在一定范围内确定新的定位信息精度

if(newLocation.getAccuracy()>50.0//){

return false;

}

//还可以添加其他各种判断

return true;

}