针对定位服务,android的API里提供了LocationManager这么一个类
通过getLastKnownLocation(String provider)以及requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)方法可以获取到当前位置
此类提供两种定位方式:GPS定位和网络定位(基站+WIFI)
GPS定位的provider是LocationManager.GPS_PROVIDER, 网络定位则是LocationManager.NETWORK_PROVIDER
不过这两个接口都受限于系统设置,如下图:
如果上面两个开关都关了,自然就无法获取到GPS经纬度了(如何摆脱这种限制通过其他方式获取经纬度在下一章再介绍)
(假定开关都打开的前提)
GPS定位的获取方式
通过getLastKnownLocation(String provider)传对应参数,此时得到的Location并非当前的GPS位置信息,而是上一次获取到的位置信息
而requestLocationUpdates才是真正去请求位置信息的更新,可以理解为调用该方法后,会安装指定的规则去收集GPS信息,例如你请求locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,30 * 1000, 0, myListenGPS);
则每隔三十秒钟会收集一次GPS信息,如果收集到的话,会保存到系统存储中(保存至系统存储属个人理解)并通知myListenGPS监听器位置信息改变同时调用监听器onLocationChanged(Location location),那么每次我们调用getLastKnownLocation事实上就是从这个系统存储中获取这个信息,所以如果我们不调用此方法,getLastKnownLocation获取到的就
可能是N天以前的位置信息了。
网络定位的获取方式
其实同GPS差不多,保存到系统存储中的位置自然是跟GPS分开的。
二者区别
GPS定位准确,但在室内几乎无法定位而导致无法收集信息,即有定位盲区;网络定位偏差较大,但无盲区,只要有网络一般都可以收集的到;
另外经过本人手机实测,如果requestLocationUpdates的时候设置最少更新时间1S,最小更新距离为0的时候,GPS定位在有信号的情况下的确是每秒都刷新位置,
但网络定位大概是四五十秒更新一次(可能跟手机信号有关),如果把它设置为60秒的话,基本上两种定位方式都在六七十秒后更新位置信息
所以这个时间还是有些偏差的,这点大家务必要注意
部分童鞋可能对网络定位(基站+WIFI)不是很理解,简单来说就是你当前接入WIFI就使用WIFI定位,当前接入2G或3G网就是基站定位
其实针对基站和WIFI有单独的定位方式,只不过系统帮我们封装了这么个智能的方法,好是好就是受限于设置开关
为了达到实时定位的功能,现在广为流传的是GPS+基站定位方式,该基站定位即单独的定位方式,不受开关限制,所以在各个应用中用得比较多
如何基站定位且听下回分解