最近在做一个天气预报的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;
- }
我这里只是通过经纬度查询城市天气预报。也可以通过其他的方式,具体的请看上面那个链接。