Android获取所在地城市名

本文介绍了一种通过经纬度信息获取城市名称的方法,并提供了具体的Java实现代码。该方法利用了Geocoder类来解析经纬度对应的地理位置信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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" />

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值