在Android中确定位置并不困难,主要借助LocationManager这个类就可以实现。
LocationManager的基本用法:
获得LocationManager实例:

LocationManager lm=(LocationManager) getSystemService(Context.LOCATION_SERVICE);

接着我们需要一个位置提供器来确定当前设备的位置。Android中一般有三种位置提供器可供选择GPS_PROVIDER、NETWORK_PROVIDER、PASSIVE_PROVIDER.其中前两种用的较多,分别是GPS定位和网络定位。GPS定位的精准度比较高但是非常耗电;而网络定位的精准度稍差,但耗电量比较少。
选择好位置提供器传入到getLastKnownLocation();方法中:

String provider=lm.NETWORK_PROVIDER;Location location=lm.getLastKnownLocation(provider);

如果不确定有哪些位置提供器可以用,先获得启用的位置提供器,在进行判断:

List<String> providerList=lm.getProviders(true);

调用getLastKnownLocation()方法虽然能够获取到设备的当前位置信息,但是用户完全有可能带着设备随时移动的,怎样才能在设备位置改变的时候获取到最新的位置信息呢?LocationManager还提供了一个requestLocationUpdates()方法,该方法需要4个参数:第一个参数是位置提供其的类型,第二个参数是监听位置变化的间隔时间(毫秒),第三个参数是监听位置变化的距离间隔(米),第四个参数则是LocationListener监听器。监听器的onLocationChanged()方法在每次位置变化的时候就会执行。
通过Location实例对象获得当前位置的经纬度:

location.getLatitude();location.getLongitude();

移除位置监听器:

lm.removeUpdates(locationListener);

记得添加权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

反地理编码:
通过反地理编码,将经纬度值转换成看得懂的位置信息。
其实Android本身就提供了地理编码的API,主要是使用GeoCoder这个类实现的,可以非常简单的完成正向和反向的地理编码,但是,非常遗憾,GeoCoder长期存在一些严重的bug,因此我们不得不寻找GeoCoder的替代方案。
还算幸运,google提供了一套Gedcoding API,可以完成反地理编码。用法如下:

private void showLocation(final Location location){    new Thread(new Runnable() {        @Override        public void run() {            try {                StringBuilder strUrl=new StringBuilder();                strUrl.append("http://maps.googleapis.com/maps/api/geocode/json?latlng=");                strUrl.append(location.getLatitude()).append(",");                strUrl.append(location.getLongitude());                strUrl.append("&sensor=false");                URL url=new URL(strUrl.toString());                HttpURLConnection conn= (HttpURLConnection) url.openConnection();                conn.setRequestMethod("GET");                conn.setConnectTimeout(5000);                conn.setReadTimeout(5000);                conn.setRequestProperty("Accept-Language", "zh-CN");                InputStream in=conn.getInputStream();                BufferedReader reader=new BufferedReader(new InputStreamReader(in));                StringBuilder sb=new StringBuilder();                String line=null;                while((line=reader.readLine())!=null){                    sb.append(line);                }                JSONObject jsonObject=new JSONObject(sb.toString());                JSONArray jsonArray=jsonObject.getJSONArray("results");                if (jsonArray.length()>0){                    JSONObject subObject=jsonArray.getJSONObject(0);                    String address=subObject.getString("formatted_address");                    handler.sendMessage(handler.obtainMessage(0,address));                }            } catch (Exception e) {                e.printStackTrace();            }        }    }).start();}private Handler handler=new Handler(){    @Override    public void handleMessage(Message msg) {        switch (msg.what){            case 0:                tv.setText((String)(msg.obj));                break;        }    }}

这种方法实际就是将定位服务获取的经纬度信息拼接到Geocoding API的url上,通过解析返回的数据获得地理信息。
为避免中文乱码问题,需要在http请求头设置:

conn.setRequestProperty("Accept-Language", "zh-CN");

更多相关文章

  1. Android Studio 默认debug证书位置在哪里(Mac os)
  2. Android GPS (当前位置 & GPS信息更新)
  3. [原创] Android GPS (当前位置 & GPS信息更新)
  4. Android帮助文档翻译——开发指南(十五)获取用户位置
  5. Android动画效果 translate、scale、alpha、rotate 切换Activity

随机推荐

  1. 好玩、有趣的 Linux 命令学习神器 kmdr!
  2. 百分点认知智能实验室:基于不完全标注样本
  3. 软件开发之交付清单详解
  4. kubernetes ingress 原理、部署
  5. 一个Python程序,可以帮助您自动备份文件
  6. 系统之眼!Linux系统性能监控工具Glances
  7. 介绍Dynamics 365/Power Apps生成PDF的功
  8. MuleSoft网站的架构变迁
  9. 必备技能!Shell编程实战案例分享(PDF版)!
  10. 5s!用浏览器打造一个开箱即用的Linux系统