- 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 {
-
-
-
- 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);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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");
- }
- }
-
-
-
-
-
- public String getCity(){
- return city;
- }
-
-
-
-
-
-
- public String reverseGeocode(Location loc) {
-
- String localityName = "";
- HttpURLConnection connection = null;
- URL serverAddress = null;
-
- try {
-
-
-
- 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);
-
- connection = null;
-
-
- 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;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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;
- }
- }
- }
- }
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#