在项目中需要定位当前用户所在城市,然后根据不同城市返回不同的数据。一般来说,定位有两种方式,1、用第三方的定位sdk,如百度定位;2、用android自带的sdk中的api定位。

一、用百度SDK定位。这个具体操作见百度开发者平台。

二、用android自带的SDK定位。一般情况下,获取经纬度是很简单,再根据经纬度获取城市,这个获取城市也有多种方法。

定位获取经纬度:

private Location getLocation() {        //获取位置管理服务        //查找服务信息        Criteria criteria = new Criteria();        criteria.setAccuracy(Criteria.ACCURACY_FINE); //定位精度: 最高        criteria.setAltitudeRequired(false); //海拔信息:不需要        criteria.setBearingRequired(false); //方位信息: 不需要        criteria.setCostAllowed(true);  //是否允许付费        criteria.setPowerRequirement(Criteria.POWER_LOW); //耗电量: 低功耗//        String provider = myLocationManager.getBestProvider(criteria, true); //获取GPS信息//        myLocationManager.requestLocationUpdates(provider,2000,5,locationListener);//        Log.e("provider", provider);//        List list = myLocationManager.getAllProviders();//        Log.e("provider", list.toString());//        Location gpsLocation = null;        Location netLocation = null;        myLocationManager.addGpsStatusListener(myListener);        if (netWorkIsOpen()) {            //2000代表每2000毫秒更新一次,5代表每5秒更新一次            myLocationManager.requestLocationUpdates("network", 2000, 5, locationListener);            netLocation = myLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);        }        if (gpsIsOpen()) {            myLocationManager.requestLocationUpdates("gps", 2000, 5, locationListener);            gpsLocation = myLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);        }        if (gpsLocation == null && netLocation == null) {            return null;        }        if (gpsLocation != null && netLocation != null) {            if (gpsLocation.getTime() < netLocation.getTime()) {                gpsLocation = null;                return netLocation;            } else {                netLocation = null;                return gpsLocation;            }        }        if (gpsLocation == null) {            return netLocation;        } else {            return gpsLocation;        }    }
定位主要有两种方式,GPS和NetWork。以上就是判断哪种方式可用就用哪个。

private boolean gpsIsOpen() {    boolean isOpen = true;    if (!myLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {//没有开启GPS        isOpen = false;    }    return isOpen;}private boolean netWorkIsOpen() {    boolean netIsOpen = true;    if (!myLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {//没有开启网络定位        netIsOpen = false;    }    return netIsOpen;}
自定义LocationListener

   //监听GPS位置改变后得到新的经纬度    private LocationListener locationListener = new LocationListener() {        public void onLocationChanged(Location location) {            Log.e("location", location.toString() + "....");            // TODO Auto-generated method stub            if (location != null) {                //获取国家,省份,城市的名称                Log.e("location", location.toString());//                List m_list = getAddress(location);                new MyAsyncExtue().execute(location);//                Log.e("str", m_list.toString());//                String city = "";////                if (m_list != null && m_list.size() > 0) {////                    city = m_list.get(0).getLocality();//获取城市////                }//                city = m_list;//                show_GPS.setText("location:" + m_list.toString() + "\n" + "城市:" + city + "\n精度:" + location.getLongitude() + "\n纬度:" + location.getLatitude() + "\n定位方式:" + location.getProvider());            } else {                show_GPS.setText("获取不到数据");            }        }        @Override        public void onStatusChanged(String provider, int status, Bundle extras) {        }        @Override        public void onProviderEnabled(String provider) {        }        @Override        public void onProviderDisabled(String provider) {        }    };
其中的Location类就是我们需要获取到的位置信息,可以从中得到经纬度。

根据经纬度获取当前城市名的几种方式如下:(获取城市名需要网络连接,不管是百度定位的SDK,还是我们后面介绍的获取方式)

1.通过服务获取城市名(google或者baidu)

百度:http://api.map.baidu.com/geocoder?output=json&location=23.131427,113.379763&ak=esNPFDwwsXWtsQfw4NMNmur1

google:http://maps.google.com/maps/api/geocode/json?latlng=%2023.131427,113.379763&language=zh-CN&sensor=true


private class MyAsyncExtue extends AsyncTask, Void, String> {        @Override        protected String doInBackground(Location... params) {            HttpClient client = new DefaultHttpClient();            StringBuilder stringBuilder = new StringBuilder();            HttpGet httpGet = new HttpGet("http://api.map.baidu.com/geocoder?output=json&location=23.131427,113.379763&ak=esNPFDwwsXWtsQfw4NMNmur1");            try {                HttpResponse response = client.execute(httpGet);                HttpEntity entity = response.getEntity();                InputStream inputStream = entity.getContent();                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));                String b;                while ((b = bufferedReader.readLine()) != null) {                    stringBuilder.append(b + "\n");                }                inputStream.close();            } catch (IOException e) {                e.printStackTrace();            }            return stringBuilder.toString();        }        @Override        protected void onPostExecute(String m_list) {            super.onPostExecute(m_list);            Log.e("str", m_list.toString());            String city = "";//                if (m_list != null && m_list.size() > 0) {//                    city = m_list.get(0).getLocality();//获取城市//                }            city = m_list;            show_GPS.setText("城市:" + city);        }    }
这个获取到的city是json串,我只是测试是否可行,所以没有解析。

直接用http请求这连接,就会一json的形式返回当前的位置信息。不过google的服务在大陆依旧是不可用的。

2.用andorid的api获取城市。

// 获取地址信息private List getAddress(Location location) {    List result = null;    try {        if (location != null) {            Geocoder gc = new Geocoder(this, Locale.getDefault());            result = gc.getFromLocation(location.getLatitude(),                    location.getLongitude(), 1);        }    } catch (Exception e) {        e.printStackTrace();    }    return result;}
getFromLocation这个方法是耗时的,不要放在主线程中。

经测试,以上方法都是可行的。

测试结果截图如下:



更多相关文章

  1. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
  2. Android屏幕分辨率正确获取及PX,DPI,DP,SP等的对应关系
  3. android 获取唯一标识
  4. android拍照与读取相册
  5. Android(安卓)热点开关状态的判断和获取热点ssid
  6. Android软键盘适配问题
  7. AIR Native Extension的使用(Android)一 : 打包ane
  8. android之BitMap
  9. Android中GPS定位的简单应用

随机推荐

  1. android 工程库及引用
  2. Android启动过程深入解析
  3. Android(安卓)Notification 用法的4种形
  4. 《Android开发从零开始》――13.Table La
  5. Android官方架构组件DataBinding双向绑定
  6. Android 界面编程
  7. Android 设置颜色的方法总结
  8. Android Studio设置国内镜像网站
  9. Android触摸事件分发机制
  10. Android 系统framework 概述