LocationManager
Android 中一般有三种位置提供器可供选择,GPS_PROVIDER、NETWORK_PROVIDER、PASSIVE_PROVIDER。其中前两种使用的比较多,分别表示使用GPS定位和使用网络定位。这两种定位方式各有特点,GPS定位精度比较高,但是非常耗电,而网络定位的精确稍差,但耗电量比较少。
注意:
定位功能必须要由用户主动去启用才行,不然任何应用都无法获取到手机当前的位置信息。
LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
//将选择好的位置提供器传入到getLastKnownLocation()方法中,就可以得到一个Location对象。
String provider = LocationManager.NETWORK_PROVIDER;
Location location = locationManager.getLastKnownLocation(provider);
//这个Location 对象中包含了经度、纬度、海拔等一系列的位置信息,然后从中取出我们所关心的那部分数据即可。
//位置发生改变时
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10,new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onLocationChanged(Location location) {
}
});
//关闭程序时,移除监听器
locationManager.removeUpdates(locationListener);
//requestLocationUpdates()方法接收四个参数,第一个参数是位置提供器的类型,第二个参数是监听位置变化的时间间隔,以毫秒为单位,第三个参数是监听位置变化的距离间隔,以米为单位,第四个参数则是LocationListener 监听器。
反地理编码
Geocoding API用法
其实Android本身就提供了地理编码的API,主要是使用GeoCoder这个类来实现的。它可以非常简单地完成正向和反向的地理编码功能,从而轻松地将一个经纬值转换成看得懂的位置信息。
不过,非常遗憾的是,GeoCoder 长期存在着一些较为严重的bug,在反向地理编码的时候会有一定的概率不能解析出位置的信息,这样就无法保证位置解析的稳定性,因此我们不得不去寻找GeoCoder 的替代方案。
还算比较幸运,谷歌又提供了一套Geocoding API,使用它的话也可以完成反向地理编码的工作,只不过它的用法稍微复杂了一些,但稳定性要比GeoCoder 强得多。
Geocoding API 中规定了很多接口,其中反向地理编码的接口如下:http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true_or_false
sensor=true_or_false 表示这条请求是否来自于某个设备的位置传感器,通常指定成false 即可。