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;
}