Android获取所在地城市名

public class LocationUtils {  
  
    //public static String cityName = "深圳";  //城市名  
    public static String cityName ;  //城市名  
      
    private static Geocoder geocoder;   //此对象能通过经纬度来获取相应的城市等信息  
      
    /** 
     * 通过地理坐标获取城市名  其中CN分别是city和name的首字母缩写 
     * @param context 
     */  
    public static void getCNBylocation(Context context){  
          
        geocoder = new Geocoder(context);  
        //用于获取Location对象,以及其他  
        LocationManager locationManager;   
        String serviceName = Context.LOCATION_SERVICE;  
        //实例化一个LocationManager对象  
        locationManager = (LocationManager)context.getSystemService(serviceName);  
        //provider的类型  
        String provider = LocationManager.NETWORK_PROVIDER;  
  
        Criteria criteria = new Criteria();  
        criteria.setAccuracy(Criteria.ACCURACY_FINE);   //高精度  
        criteria.setAltitudeRequired(false);    //不要求海拔  
        criteria.setBearingRequired(false); //不要求方位  
        criteria.setCostAllowed(false); //不允许有话费  
        criteria.setPowerRequirement(Criteria.POWER_LOW);   //低功耗  
          
        //通过最后一次的地理位置来获得Location对象  
        Location location = locationManager.getLastKnownLocation(provider);  
          
        String queryed_name = updateWithNewLocation(location);  
        if((queryed_name != null) && (0 != queryed_name.length())){  
              
            cityName = queryed_name;  
        }  
          
        /* 
         * 第二个参数表示更新的周期,单位为毫秒;第三个参数的含义表示最小距离间隔,单位是米 
         * 设定每30秒进行一次自动定位 
         */  
        locationManager.requestLocationUpdates(provider, 30000, 50,  
                locationListener);  
        //移除监听器,在只有一个widget的时候,这个还是适用的  
        locationManager.removeUpdates(locationListener);  
    }  
      
    /** 
     * 方位改变时触发,进行调用 
     */  
    private final static LocationListener locationListener = new LocationListener() {  
        String tempCityName;  
        public void onLocationChanged(Location location) {  
              
            tempCityName = updateWithNewLocation(location);  
            if((tempCityName != null) && (tempCityName.length() != 0)){  
                  
                cityName = tempCityName;  
            }  
        }  
  
        public void onProviderDisabled(String provider) {  
            tempCityName = updateWithNewLocation(null);  
            if ((tempCityName != null) && (tempCityName.length() != 0)) {  
  
                cityName = tempCityName;  
            }  
        }  
  
        public void onProviderEnabled(String provider) {  
        }  
  
        public void onStatusChanged(String provider, int status, Bundle extras) {  
        }  
    };  
  
    /** 
     * 更新location 
     * @param location 
     * @return cityName 
     */  
    private static String updateWithNewLocation(Location location) {  
        String mcityName = "";  
        double lat = 0;  
        double lng = 0;  
        List<Address> addList = null;  
        if (location != null) {  
            lat = location.getLatitude();  
            lng = location.getLongitude();  
        } else {  
  
            System.out.println("无法获取地理信息");  
        }  
           
        try {  
              
            addList = geocoder.getFromLocation(lat, lng, 1);    //解析经纬度  
              
        } catch (IOException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        if (addList != null && addList.size() > 0) {  
            for (int i = 0; i < addList.size(); i++) {  
                Address add = addList.get(i);  
                mcityName += add.getLocality();  
            }  
        }  
        if(mcityName.length()!=0){  
              
            return mcityName.substring(0, (mcityName.length()-1));  
        } else {  
            return mcityName;  
        }  
    }  
  
    /** 
     * 通过经纬度获取地址信息的另一种方法 
     * @param latitude 
     * @param longitude 
     * @return 城市名 
     */  
    public static String GetAddr(String latitude, String longitude) {    
        String addr = "";    
          
        /* 
         * 也可以是http://maps.google.cn/maps/geo?output=csv&key=abcdef&q=%s,%s,不过解析出来的是英文地址 
         * 密钥可以随便写一个key=abc 
         * output=csv,也可以是xml或json,不过使用csv返回的数据最简洁方便解析     
         */  
        String url = String.format(    
            "http://ditu.google.cn/maps/geo?output=csv&key=abcdef&q=%s,%s",    
            latitude, longitude);    
        URL myURL = null;    
        URLConnection httpsConn = null;    
        try {    
              
            myURL = new URL(url);    
        } catch (MalformedURLException e) {    
          e.printStackTrace();    
          return null;    
        }    
          
        try {    
          
            httpsConn = (URLConnection) myURL.openConnection();    
              
            if (httpsConn != null) {    
                InputStreamReader insr = new InputStreamReader(    
                        httpsConn.getInputStream(), "UTF-8");    
                BufferedReader br = new BufferedReader(insr);    
                String data = null;    
                if ((data = br.readLine()) != null) {    
                    String[] retList = data.split(",");    
                    if (retList.length > 2 && ("200".equals(retList[0]))) {    
                        addr = retList[2];    
                    } else {    
                        addr = "";    
                    }    
                }    
                insr.close();    
            }    
        } catch (IOException e) {    
          
            e.printStackTrace();    
           return null;    
        }    
           return addr;    
    }  
      
}  



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

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Android中,城市二级列表联动是指根据用户在一级列表中所选中的省份,动态显示对应的二级子列表中的城市。这样的功能在很多应用中都会用到,比如选择所在城市、选择配送地址等。 要实现城市二级列表联动,首先我们需要准备城市数据。可以通过使用城市数据库或者本地存储文件的方式来获取城市数据,包括省和市的称。根据这些数据,我们可以构建一个二维的数据结构,使得每一个省份对应一个城市列表。 接下来,在Android中可以将一级列表使用RecyclerView或者ListView来展示,通过适配器将省份数据绑定到列表上。当用户点击某个省份时,可以通过监听点击事件获取到省份的位置信息,根据位置信息获取对应的城市列表数据。 然后,我们可以将二级城市列表数据展示在另一个RecyclerView或者ListView上。同样,需要使用适配器将城市数据绑定到二级列表上。通过刷新适配器的方式实现二级列表的动态更新。 最后,我们还需要处理联动的逻辑。当用户点击一级列表的省份时,我们需要根据省份的位置信息获取对应的城市列表数据,并将城市列表数据绑定到二级列表的适配器上。这样,在界面上就会实现二级列表的联动效果。 在实现过程中需要考虑的一些问题有:如何获取并加载城市数据、如何处理列表的点击事件、如何实现二级列表的动态更新等。总之,通过使用RecyclerView或者ListView以及相应的适配器,我们可以比较容易地实现Android城市二级列表联动的功能。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值