对于很多APP来说,利用LocationManager进行定位是常见的功能。LocationManager是Android系统提供的核心服务之一,封装了GPS、网络等多个定位方式,并通过它们来确定设备的当前位置。无论是社交网络、导航软件还是智能家居APP,都需要使用定位服务来提供更好的用户体验。如何更好地利用LocationManager定位功能,应该是每一个开发者应该掌握的关键。
LocationManager简介
LocationManager是一个与Android系统提供的Location API交互的接口类,它能够为开发者提供高质量的位置信息。通过LocationManager,开发者可以使用不同的Provider来获取设备的位置信息,Provider分为GPS_PROVIDER、NETWORK_PROVIDER、PASSIVE_PROVIDER等多个方式。其中,GPS_PROVIDER是通过定位卫星获取设备本身的位置信息;NETWORK_PROVIDER是通过网络获取设备的位置信息;PASSIVE_PROVIDER是根据第三方APP已经收到的位置信息提供设备位置信息。
LocationManager常用方法
常用方法:
getLastKnownLocation(String provider):从指定的Provider中获取上次的定位信息,返回一个Location对象。
requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener):注册位置更新监听器。
removeUpdates(LocationListener listener):注销位置更新监听器。
isProviderEnabled(String provider):判断Provider是否可用。
addProximityAlert(double latitude, double longitude, float radius, long expiration, PendingIntent intent):在指定的位置周围添加Proximity Alert。
removeProximityAlert(PendingIntent intent):移除指定的Proximity Alert。
LocationManager的实现过程
选取Provider
开发者在使用LocationManager获取设备的位置信息时,需要首先选择Provider。LocationManager提供了三种Provider,选择方法因使用场景而异。一般来说,我们需要在使用前了解Provider的特点,选择适合当前场景的Provider:
GPS_PROVIDER:定位精度较高,但需要有联网功能,且尽量在不深层次的室内使用,因为层次越深,GPS的信号就会受到更多的限制;
NETWORK_PROVIDER:通过基站信息进行定位,定位精度相对于GPS会差一些,但通常情况下能够正常满足定位需求,而且不需要有联网功能。一般使用时只用在几乎没有移动的情况下使用;
PASSIVE_PROVIDER:相对于前两种Provider可能使用较少,可以感知其它APP已经获取到的位置信息,并据此获得本机当前位置。
注册位置监听器
由于设备的位置信息可能是正在变化的,所以我们通过注册位置监听器的方式持续地更新设备的位置信息。轮询方式随着应用使用时间的增加会导致电池能量的消耗量逐渐增加,因此更倾向于使用Listener来获取数据。
一般用法如下:
在Activity中初始化LocationManager,并调用requestLocationUpdates()方法注册监听器。
```java
public class MainActivity extends Activity implements LocationListener {
private LocationManager lm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 8, this);
}
……}
```
其中,第一个参数是Provider的名称;第二个参数是两个更新之间的最短时间(单位:毫秒);第三个参数是两个更新之间移动的最小距离(单位:米),当设备移动的距离超过这个值后就会更新位置信息;第四个参数是LocationListener监听器对象。
重写监听方法
重写了LocationListener监听器的onLocationChanged()方法、onProviderEnabled()方法、onStatusChanged()方法、onProviderDisabled()方法。其中,主要的是onLocationChanged()方法,用于向应用提供最新的位置信息。
```
public class MainActivity extends Activity implements LocationListener {
........
public void onLocationChanged(Location location) {
Log.i("TAG","Location changed------");
Log.i("TAG","Latitude====="+location.getLatitude());
Log.i("TAG","Longitude====="+location.getLongitude());
}
........}
```
getLastKnownLocation()方法
在一些场景下,我们需要立即获得设备的位置信息,而不是等待Listener接收到最新的位置信息。 此时,可以使用getLastKnownLocation()方法来获取设备在最近一次定位到的位置信息。
```java
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
double latitude = location.getLatitude();//维度
double longitude = location.getLongitude();//经度
LogUtils.i(TAG, "Longitude:" + longitude + ", Latitude:" + latitude);
}
```
对于非常及时获取到位置信息的场景,getLastKnownLocation()并不能满足要求,因为,它只能获取到最近一次位置信息,而更新频率又跟用户的位置变化情况有关,实时性其实不高,需要通过注册LocationListener监听位置变化才能够较好的获取到新的位置信息。
判断Provider是否可用
查询Provider是否可用的方法为:
```java
public boolean isProviderEnabled(String provider)
```
其中,provider可以是GPS_PROVIDER、NETWORK_PROVIDER和PASSIVE_PROVIDER等,可用性结果为boolean。
1.在GPS业务场景下优先使用GPS定位(GPS_PROVIDER)。
2.需要及时或不时刻刻获取定位点的数据时,建议使用Listener。
3.需要使用到缓存,可以通过调用getLastKnownLocation(provider)来获取缓存中的位置数据。
4.通过isProviderEnabled()方法去检测Provider是否可用。
5.在收集到设备位置信息后,尽可能在后台使用Service或重写Application全局类对信息进行缓存,来保证应用在下次需要信息时的恢复成功率。
LocationManager的定位服务是一项核心服务,是基于经纬度等设备位置信息的技术,在地图导航、城市出行、社交网络等领域应用广泛。如何更好地利用LocationManager定位功能,可以提高APP的用户体验,是每一个开发者都应该掌握和实践的重要技能。