Android 中一般有三种位置提供器可供选择:
1.GPS_PROVIDER 代表GPS定位: GPS定位的精准度比较高,但是非常耗电
2.NETWORK_PROVIDER 代表网络定位 :网络定位的精准度稍差,但耗电量比较少。
3.PASSIVE_PROVIDER 基站定位
需要注意的是,定位功能必须要由用户主动去启用才行,不然任何应用程序都无法获取到
手机当前的位置信息。进入手机的设置→定位服务
获取地理位置的权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
对于下面代码的showLocation这个方法:这种方式获取的经纬度信息可读性不好
所以:
在手机端我们可以向谷歌的服务器发起一条 HTTP 请求,并将经纬度的值作为参数一同传递
过去,然后服务器会帮我们将这个经纬值转换成看得懂的位置信息,再将这些信息返回给手
机端,最后手机端去解析服务器返回的信息,并进行处理就可以了。
GeocodingAPI 中规定了很多接口,其中反向地理编码的接口如下:
我们来仔细看下这个接口的定义,其中 http://maps.googleapis.com/maps/api/geocode/是固
定的,表示接口的连接地址。json 表示希望服务器能够返回 JSON 格式的数据,这里也可以
指定成 xml。latlng=40.714224,-73.96145 表示传递给服务器去解码的经纬值是北纬 40.714224
度,西经 73.96145度。sensor=true_or_false 表示这条请求是否来自于某个设备的位置传感器,
通常指定成 false 即可。
代码如下:获取手机的经纬度:
public class MainActivity extends Activity {
private TextView text_location;
private LocationManager locationManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text_location = (TextView) findViewById(R.id.text);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//接着需要选择一个位置提供器来确定设备当前的位置,一个有三种方式。
//获取有哪些位置提供器可用
List<String> providers = locationManager.getProviders(true);//传入 true 就表示只有启用的位置提供器才会被返回。
System.out.println(providers);//输出开启了哪些位置提供器
String provider=null;
if(providers.contains(LocationManager.GPS_PROVIDER)){
provider=LocationManager.GPS_PROVIDER;
}else if(providers.contains(LocationManager.NETWORK_PROVIDER)){
provider=LocationManager.NETWORK_PROVIDER;
}else{
Toast.makeText(this, "没有可用的位置提供器",0).show();
return ;
}
Location location=locationManager.getLastKnownLocation(provider);//通过provider获取当前位置
if(location!=null){
showLocation(location);
}
//监听器:监听位置的变化
//每隔5秒检测一次移动距离,当移动距离大于1米就调用监听器的onLocationChanged方法
locationManager.requestLocationUpdates(provider, 5000, 1, listener);
}
//显示经纬度的函数
private void showLocation(Location location){
String currentPosition="纬度:"+location.getLatitude()+"\n"+"经度:"+location.getLongitude();//获取经纬度
text_location.setText(currentPosition);//为文本视图设置当前的位置
}
@Override
protected void onDestroy() {
super.onDestroy();
if(locationManager!=null){
locationManager.removeUpdates(listener);//关闭程序时将监听器移除
}
}
LocationListener listener=new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
System.out.println("状态改变");
}
@Override
public void onProviderEnabled(String provider) {
System.out.println("提供器启动");
}
@Override
public void onProviderDisabled(String provider) {
System.out.println("提供器关闭");
}
@Override
public void onLocationChanged(Location location) {
System.out.println("位置改变");
showLocation(location);
}
};
}
布局文件中只有一个TextView显示获取到的经纬度