在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. FileProvider无法获取外置SD卡问题解决方案 | Failed to find co
  3. Android(安卓)GPS (当前位置 & GPS信息更新)
  4. android 将RecyclerView当成ViewPager用的一系列问题
  5. Android(安卓)内容提供器---创建内容提供器(元素)
  6. 在Android的c/c++代码中使用LOG
  7. unity3d开发一:入门知识+导入模型+旋转脚本
  8. Android中LocationManager的简单使用,获取当前位置
  9. 谈谈Android的so

随机推荐

  1. create new Android(安卓)Virtual Device
  2. 在线安装ADT总是出现以下错误
  3. android如何编差分包升级
  4. Android实现邮箱验证功能
  5. 为android应用程序添加桌面快捷方式
  6. 获取来电号码
  7. android第二天学习
  8. 四极管: Android开发调试I2C设备驱动 i2cd
  9. Android反射调用goToSleep实现一键锁屏、
  10. Android(安卓)Bitmap相关[转]