通过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显示获取到的经纬度

 

posted @ 2016-05-07 17:28  ts-android  阅读(1090)  评论(0编辑  收藏  举报