通过android自带包获取经纬度
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?latlng=40.714224,-73.961
452&sensor=true_or_false
我们来仔细看下这个接口的定义,其中 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显示获取到的经纬度