现在的位置: 首页 > 综合 > 正文

Android中通过当前经纬度获得城市

2013年12月13日 ⁄ 综合 ⁄ 共 5270字 ⁄ 字号 评论关闭
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

抱歉!评论已关闭.