`
zhouxiaoli521
  • 浏览: 562287 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
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#

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Android 获取当前的经纬度和地理位置

    这就是在Android中获取当前经纬度和地理位置的基本步骤。通过结合Location API和Geocoder,我们不仅可以获得设备的精确位置,还能获取到与该位置相关的详细地址信息。这个过程对于实现导航、定位、位置跟踪等功能至...

    Android 获取当前经纬度

    在Android开发中,获取设备的当前经纬度是常见的需求,这通常用于实现定位服务,比如导航、地图应用或者提供基于位置的服务。以下将详细介绍两种主要的获取方法:GPS(全球定位系统)和网络定位,以及如何通过...

    Android 通过当前经纬度获得城市的实例代码

    在Android开发中,有时我们需要根据用户的当前位置(经纬度)来获取用户所在的城市信息。这个功能在许多应用中都很常见,例如天气预报、导航或者个性化推荐等。以下是一个使用Java和Android SDK实现的实例代码,通过...

    Android通过原生方式获取经纬度与城市信息的方法

    在Android开发中,获取用户当前的经纬度和城市信息是常见的需求,这通常用于实现位置服务,例如导航、天气预报等。本篇文章将详细介绍如何通过Android原生SDK获取这些信息,包括GPS定位和WiFi定位两种方式。 首先,...

    Android 根据经纬度获取地址

    4. **获取经纬度**:首先,你需要通过LocationManager或FusedLocationProviderClient来获取用户的当前位置。使用`requestLocationUpdates()`方法监听位置更新,然后从Location对象中提取经纬度。 5. **反向地理编码...

    android 获取经纬度及街道信息百度定位

    总之,“LBStest”项目通过集成百度地图SDK,实现了在Android应用中获取并显示设备的经纬度和街道信息。这个过程中涉及的关键技术包括Android权限管理、地图组件的使用、定位监听以及与百度地图API的交互。对于...

    通过百度地图,根据地名获取经纬度,内有详解

    在网络定位中,可以通过经纬度信息查询百度地图API的反地理编码服务,获取到具体的位置信息,如街道、城市等。同时,如果设备支持GPS,还可以获取更精确的卫星定位数据。 在Android项目中,`AndroidManifest.xml`...

    android城市列表选择、定位

    在Android开发中,"android城市列表选择、定位"是一个常见的需求,涉及到用户界面设计、数据管理以及地理位置服务等多个方面。以下将详细解析这个主题中的关键知识点。 首先,**城市列表**是应用程序中常见的一种...

    Android通过百度api获取地名城市名

    在Android开发中,有时我们需要获取用户的地理位置信息,例如地名和城市名,这可以通过集成百度地图API来实现。本文将详细介绍如何在Android应用中利用百度API获取地名和城市名,以及相关的步骤和技术要点。 首先,...

    Android 获取当前位置,地区名称完整实

    在Android开发中,获取设备的当前位置以及地区名称是常见的需求,比如用于导航、天气查询或者个性化服务等。本文将深入探讨如何在Android应用中实现这一功能,主要涉及以下几个知识点: 1. **Android权限管理**: ...

    Android简单的测量手机经纬度的工具

    在Android平台上,开发一个能够测量手机经纬度的工具是一项常见的任务,这主要涉及到地理位置服务的使用。本项目名为“Android简单的测量手机经纬度的工具”,它利用了Android系统的定位服务来获取设备的地理坐标,...

    自动获取当前所在城市

    在Android开发中,获取用户当前所在城市的名字是一个常见的需求,主要应用于天气预报、导航、个性化服务等场景。本文将详细讲解如何实现这一功能。 首先,我们需要理解Android中的位置定位服务。Android提供了`...

    基于Android的输入城市查询天气情况

    请求参数通常包括城市的经纬度或城市名,以及可能的API密钥。 2. **获取并解析响应**: 一旦请求发送,API会返回一个JSON或XML格式的响应,包含天气数据。使用Gson、Jackson或Android自带的JsonParser等库解析这个...

    android 基站定位 返回定位的城市

    使用该SDK,开发者可以在Android应用中轻松集成定位功能,获取到用户当前的经纬度坐标,并根据这些坐标解析出具体地址。 基站定位的原理是,每个移动通信基站都有一个特定的识别码和覆盖范围。当手机连接到基站时,...

    android 手机通讯录,携程客户端城市列表

    在Android平台上,手机通讯录是用户管理联系人信息的核心组件,而携程客户端的城市列表选择功能则是旅行应用中不可或缺的一部分。这两个看似不相关的模块实际上都涉及到Android应用开发中的多个关键技术点,下面将对...

    android 仿美团城市定位选择

    在Android开发中,实现“仿美团城市定位选择”的功能是一项常见的需求,这涉及到地理定位、UI设计以及数据管理等多个方面。下面将详细讲解这个过程中的关键知识点。 首先,我们需要了解地理定位的基础。在Android中...

    获取移动基站LAC CELLID 以及基站经纬度,国家,省会,城市,详细地址代码

    - **手机SDK**:部分智能手机操作系统,如Android和iOS,提供了获取当前基站信息的API,开发者可以通过编程获取并解析这些信息,然后结合其他服务查询更详细的位置信息。 - **信号扫描工具**:有一些软件应用能够...

    android 不错的中国城市间切换

    Android提供了SQLite数据库作为本地数据存储的选择,开发者可以创建一个包含城市名、经纬度、时区等信息的表,然后通过查询来获取所需的城市数据。另外,考虑到性能和内存管理,可以使用ContentProvider或者LiveData...

    请求经纬度

    在Android系统中,我们可以利用定位服务来获取设备当前的经纬度信息。 1. **GPS(全球定位系统)获取经纬度** GPS是全球范围内的卫星导航系统,能够提供实时、精确的位置信息。在Android中,我们可以通过`...

Global site tag (gtag.js) - Google Analytics