package com.yy; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import android.content.Context; import android.location.Location; import android.location.LocationManager; public class GetCity { /** * 借助Google MAP 通过用户当前经纬度 获得用户当前城市 */ static final String GOOGLE_MAPS_API_KEY = "abcdefg"; private LocationManager locationManager; private Location currentLocation; private String city="全国"; public GetCity(Context context) { this.locationManager = (LocationManager) context .getSystemService(Context.LOCATION_SERVICE); //只是简单的获取城市 不需要实时更新 所以这里先注释 // this.locationManager.requestLocationUpdates( // LocationManager.GPS_PROVIDER, 1000, 0, // new LocationListener() { // public void onLocationChanged(Location loc) { // //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发 // // Save the latest location // currentLocation = loc; // // Update the latitude & longitude TextViews // System.out // .println("getCity()" // + (loc.getLatitude() + " " + loc // .getLongitude())); // } // // public void onProviderDisabled(String arg0) { // System.out.println(".onProviderDisabled(关闭)"+arg0); // } // // public void onProviderEnabled(String arg0) { // System.out.println(".onProviderEnabled(开启)"+arg0); // } // // public void onStatusChanged(String arg0, int arg1, // Bundle arg2) { // System.out.println(".onStatusChanged(Provider的转态在可用、" + // "暂时不可用和无服务三个状态直接切换时触发此函数)"+ // arg0+" "+arg1+" "+arg2); // } // }); currentLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (currentLocation == null) currentLocation = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); } /** * 开始解析 */ public void start() { if(currentLocation!=null){ new Thread(){ public void run(){ String temp=reverseGeocode(currentLocation); if(temp!=null&&temp.length()>=2) city=temp; } }.start(); }else{ System.out.println("GetCity.start()未获得location"); } } /** * 获得城市 * @return */ public String getCity(){ return city; } /** * 通过Google map api 解析出城市 * @param loc * @return */ public String reverseGeocode(Location loc) { // http://maps.google.com/maps/geo?q=40.714224,-73.961452&output=json&oe=utf8&sensor=true_or_false&key=your_api_key String localityName = ""; HttpURLConnection connection = null; URL serverAddress = null; try { // build the URL using the latitude & longitude you want to lookup // NOTE: I chose XML return format here but you can choose something // else serverAddress = new URL("http://maps.google.com/maps/geo?q=" + Double.toString(loc.getLatitude()) + "," + Double.toString(loc.getLongitude()) + "&output=xml&oe=utf8&sensor=true&key=" + GOOGLE_MAPS_API_KEY); // set up out communications stuff connection = null; // Set up the initial connection connection = (HttpURLConnection) serverAddress.openConnection(); connection.setRequestMethod("GET"); connection.setDoOutput(true); connection.setReadTimeout(10000); connection.connect(); try { InputStreamReader isr = new InputStreamReader(connection .getInputStream()); InputSource source = new InputSource(isr); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); XMLReader xr = parser.getXMLReader(); GoogleReverseGeocodeXmlHandler handler = new GoogleReverseGeocodeXmlHandler(); xr.setContentHandler(handler); xr.parse(source); localityName = handler.getLocalityName(); System.out.println("GetCity.reverseGeocode()"+localityName); } catch (Exception ex) { ex.printStackTrace(); } } catch (Exception ex) { ex.printStackTrace(); System.out.println("GetCity.reverseGeocode()"+ex); } return localityName; } /** * The final piece of this puzzle is parsing the xml that is returned from * google’s service. For this example I am using the java SAX (simple api * for xml) parser. The final class to show here is * GoogleReverseGeocodeXmlHandler. In my example, I only want the name of * the city the user is in, so my XmlHandler class I’m about to show only * parses that piece of information. If you want to grab more complete * information (I’ll also give an example file that contains the XML * returned by Google), you’ll have to add more to this class * * @author Administrator * */ public class GoogleReverseGeocodeXmlHandler extends DefaultHandler { private boolean inLocalityName = false; private boolean finished = false; private StringBuilder builder; private String localityName; public String getLocalityName() { return this.localityName; } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); if (this.inLocalityName && !this.finished) { if ((ch[start] != '\n') && (ch[start] != ' ')) { builder.append(ch, start, length); } } } @Override public void endElement(String uri, String localName, String name) throws SAXException { super.endElement(uri, localName, name); if (!this.finished) { if (localName.equalsIgnoreCase("LocalityName")) { this.localityName = builder.toString(); this.finished = true; } if (builder != null) { builder.setLength(0); } } } @Override public void startDocument() throws SAXException { super.startDocument(); builder = new StringBuilder(); } @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { super.startElement(uri, localName, name, attributes); if (localName.equalsIgnoreCase("LocalityName")) { this.inLocalityName = true; } } } }
参考:
http://kryptonum.iteye.com/blog/363950
http://www.cnblogs.com/transmuse/archive/2010/12/31/1923358.html
http://blog.csdn.net/dadoneo/archive/2011/03/18/6259781.aspx
http://www.ispiders.net/?p=325
http://www.smnirven.com/?p=39#
转帖:http://mycoding.iteye.com/blog/1014359