您的位置:首页 > 移动开发 > Android开发

【Android应用开发】-(17)获取Google天气预报通过Xml和JSON解析数据

2011-06-04 14:04 1481 查看
最近在做一个天气预报的Widget,通过google提供的api可以查询全世界的天气情况,这篇文章主要讲述如何通过Android的JSON获取城市的经纬度,程序很简单。稍后我将demo供来此博客的朋友。废话少说,且看下文:
设计如下:通过JsonDemoActivity输入国家简称,跳转到CityListActivity(用来显示城市列表),点击需要查询城市返回天气信息。在JsonDemoActivity显示天气信息,Utils是解析天气和城市的主要工具类。

知识点:
1、多个Activity之间传递数据(一般Activity之间用来传递的是基本的数据类型,比如说String,int,boolean等),其中有个方法,可以用来传递对象,我就是讲城市和天气信息写成相应的JavaBean,用来传递的;
2、Json数据解析,获取城市;
3、解析Xml数据,获取天气;
4、部分Google API的讲解;
5、解析图片。
(关于google wearher api 的说明在:http://tsov.net/weather-queries-using-the-google-weather-api/

结构如下:



以下是效果图:


(国家列表)



(城市列表)



(天气情况)

主要代码(代码不做多余解释自己看吧):

一、获取数据
/**
	 * 得到数据
	 * @param args
	 * @return
	 */
	public final static InputStream getStream(String args) {
		InputStream stream = null;
		DefaultHttpClient client = new DefaultHttpClient();
		HttpGet get = new HttpGet(args);
		try {
			HttpResponse response = client.execute(get);
			if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
				HttpEntity entity = response.getEntity();
				stream = entity.getContent();
			}
			return stream;
		} catch (Exception e) {
			e.printStackTrace();
			return stream;
		}
		
	}

二、解析天气
/**
	 * 通过解析xml数据得到天气信息
	 * @param args
	 * @return
	 */
	public static WeatherBean getCurrentWeather(String args){
		
		
		Document document = null;
		try {
			DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
			document = builder.parse(new InputSource(getStream(args)));
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (FactoryConfigurationError e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		// 当天天气
		WeatherBean weather= new WeatherBean();
		
		NodeList nodeList = document.getElementsByTagName("current_conditions").item(0).getChildNodes(); 	// 当前天气
		
		String condition = nodeList.item(0).getAttributes().item(0).getNodeValue();  	// 天气情况
		String tempF = nodeList.item(1).getAttributes().item(0).getNodeValue(); 	 	// 华氏度
		String tempC = nodeList.item(2).getAttributes().item(0).getNodeValue(); 	 	// 摄氏度
		String humidity = nodeList.item(3).getAttributes().item(0).getNodeValue(); 	 	// 湿度
		String imgUrl = nodeList.item(4).getAttributes().item(0).getNodeValue(); 	 	// 天气图片
		String windCondition = nodeList.item(5).getAttributes().item(0).getNodeValue(); // 风速描述
		
		weather.setCondition(condition);
		weather.setTempF(Integer.parseInt(tempF));
		weather.setTempC(Integer.parseInt(tempC));
		weather.setHumidity(humidity);
//		weather.setIcon(reDrawable(imgUrl));  // 解析图片
		weather.setWindCondition(windCondition);
		return weather;
		
	}

三、Google返回的Json数据,用Json解析城市

/**
	 * 通过Android 提供的Json方式解析城市信息
	 * @param countryCode
	 * @return
	 */
	public static List<CityBean> getCityInfos(String countryCode) {
		List<CityBean> cityList = new ArrayList<CityBean>();
		//
		StringBuilder sBuilder = new StringBuilder();
		BufferedReader bReader = new BufferedReader(new InputStreamReader(getStream(countryCode))); 
		try {
			for (String s = bReader.readLine(); s != null; s = bReader.readLine()) { 
				sBuilder.append(s); 
			}
		} catch (IOException e) {
			e.printStackTrace();
		} 
		
		try {
			JSONObject jsonObject = new JSONObject(sBuilder.toString()); 
			JSONArray jsonArray = jsonObject.getJSONArray("cities"); 
			
			for (int i = 0; i < jsonArray.length(); i++) {
				CityBean cityBean = new CityBean();
				JSONObject jsonObj = (JSONObject) jsonArray.opt(i);
				cityBean.setCityName(jsonObj.getString("name"));
				cityBean.setLat(jsonObj.getLong("lat"));
				cityBean.setLon(jsonObj.getLong("lon"));
				cityList.add(cityBean);
				Log.i(TAG, "name="+jsonObj.getString("name")+";lat="+jsonObj.getLong("lat")+";lon="+jsonObj.getLong("lon"));
			}
		} catch (JSONException e) {
			e.printStackTrace();
		}

		return cityList;
	}


我这里只是通过经纬度查询城市天气预报。也可以通过其他的方式,具体的请看上面那个链接。

Demo下载地址:http://download.csdn.net/source/3339328
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: