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

Android 获取Google Weather API 并通过Xml和JSON解析数据

2011-10-29 01:04 961 查看
最近在做一个天气预报的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/

结构如下:



以下是效果图:


(国家列表)


(城市列表)


(天气情况)

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

一、获取数据

view plaincopy
to clipboardprint?

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

/**
* 得到数据
* @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;
}

}

view plaincopy
to clipboardprint?

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

/**
* 通过解析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;

}

/**
* 通过解析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解析城市

view plaincopy
to clipboardprint?

/**
* 通过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;

}

/**
* 通过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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐