由于中国天气网的天气API不更新数据,我就使用百度车联网天气查询的API,需要得到的天气没怎么详细,但还是先用着,上效果图
关于定位部分可以查看:Android基于百度定位SDK(LBS)实现定位功能
车联网的天气查询可以得到json或xml数据,这里只讲如何解析xml数据;更详细信息可以查看:车联网天气查询
从网页上读取到的数据是
<CityWeatherResponse> <status>success</status> <date>2014-04-14</date> <results> <currentCity>深圳</currentCity> <weather_data> <date>周一(今天,实时:23℃)</date> <dayPictureUrl>http://api.map.baidu.com/images/weather/day/yin.png</dayPictureUrl> <nightPictureUrl>http://api.map.baidu.com/images/weather/night/yin.png</nightPictureUrl> <weather>阴</weather> <wind>微风</wind> <temperature>26 ~ 21℃</temperature> <date>周二</date> <dayPictureUrl>http://api.map.baidu.com/images/weather/day/duoyun.png</dayPictureUrl> <nightPictureUrl>http://api.map.baidu.com/images/weather/night/duoyun.png</nightPictureUrl> <weather>多云</weather> <wind>微风</wind> <temperature>27 ~ 20℃</temperature> <date>周三</date> <dayPictureUrl>http://api.map.baidu.com/images/weather/day/duoyun.png</dayPictureUrl> <nightPictureUrl>http://api.map.baidu.com/images/weather/night/duoyun.png</nightPictureUrl> <weather>多云</weather> <wind>微风</wind> <temperature>28 ~ 20℃</temperature> <date>周四</date> <dayPictureUrl>http://api.map.baidu.com/images/weather/day/duoyun.png</dayPictureUrl> <nightPictureUrl>http://api.map.baidu.com/images/weather/night/duoyun.png</nightPictureUrl> <weather>多云</weather> <wind>微风</wind> <temperature>29 ~ 22℃</temperature> </weather_data> </results> </CityWeatherResponse>
这个APP只要就是读取指定的xml,并解析让用户看起来更直观
程序目录结构
获取xml数据WeatherSource.java
package com.dzt.weather; import android.os.AsyncTask; import com.dzt.weather.constant.GlobalConstants; import com.dzt.weather.utils.NetworkUtils; public class WeatherSource { private boolean mIsFinish = false; private String mResult; private OnFinishListener mFinishListener = null; private String mCity; public WeatherSource(String city) { mCity = city; new GetSource().execute(); } public boolean isFinish() { return mIsFinish; } public String getResult() { return mResult; } class GetSource extends AsyncTask<String,Integer,String> { @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); } @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub GlobalConstants.PrintLog_D("[GetSource->doInBackground]"); mIsFinish = false; try { // http://www.weather.com.cn/data/sk/101280601.html 不再更新天气 String path = "http://api.map.baidu.com/telematics/v3/weather?location=" + mCity + "&output=xml&ak=640f3985a6437dad8135dae98d775a09"; return NetworkUtils.HttpGet(path); } catch (Exception e) { System.out.println("doInBackground--Exception"); e.printStackTrace(); return null; } // http://61.4.185.48:81/g/ } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); mResult = result; mIsFinish = true; if (mFinishListener != null) { mFinishListener.OnFinish(result); } GlobalConstants.PrintLog_D("[GetSource->onPostExecute]" + result); } } public void setOnFinishListener(OnFinishListener listener) { mFinishListener = listener; } public interface OnFinishListener { public void OnFinish(String result); } }得到数据后通过SAX解析xml数据WeatherHandler.java
package com.dzt.weather; import java.util.ArrayList; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * 使用SAX解析百度车联网天气查询得到的xml文件。 http://developer.baidu.com/map/carapi-7.htm * * @author dzt 2014.04.14 * */ public class WeatherHandler extends DefaultHandler { String status,date,currentCity; String tagName; WeatherInfo weatherInfo = null; ArrayList<WeatherInfo> weatherInfos; int flag = 0; public ArrayList<WeatherInfo> getWeathers() { return weatherInfos; } public String getDate() { return date; } public String getCity() { return currentCity; } /** * 开始解析xml文件 */ public void startDocument() throws SAXException { weatherInfos = new ArrayList<WeatherInfo>(); System.out.println("````````begin````````"); } /** * 解析xml文件结束 */ public void endDocument() throws SAXException { System.out.println("````````end````````"); } /** * 开始解析标签 */ public void startElement(String namespaceURI,String localName,String qName,Attributes attr) throws SAXException { tagName = localName; if (localName.equals("CityWeatherResponse")) { System.out.println("start-----CityWeatherResponse"); // 获取标签的全部属性 for (int i = 0; i < attr.getLength(); i++) { System.out.println("startElement " + attr.getLocalName(i) + "=" + attr.getValue(i)); } } else if (localName.equals("date")) { flag++; if (flag > 1) { weatherInfo = new WeatherInfo(); } } else if (localName.equals("results")) { System.out.println("start-----results"); } else if (localName.equals("weather_data")) { System.out.println("start-----weather_data"); } } /** * 读取到内容 */ public void characters(char[] ch,int start,int length) throws SAXException { // System.out.println("characters---tagName = " + tagName); if (tagName != null) { String data = new String(ch,start,length); if (tagName.equals("status")) status = data; else if (tagName.equals("currentCity")) currentCity = data; else if (tagName.equals("date")) { if (flag == 1) { date = data; } else { weatherInfo.setDate(data); } } else if (tagName.equals("dayPictureUrl")) { weatherInfo.setDayPictureUrl(data); } else if (tagName.equals("nightPictureUrl")) { weatherInfo.setNightPictureUrl(data); } else if (tagName.equals("weather")) { weatherInfo.setWeather(data); } else if (tagName.equals("wind")) { weatherInfo.setWind(data); } else if (tagName.equals("temperature")) { weatherInfo.setTemperature(data); } } } /** * 解析标签结束 */ public void endElement(String namespaceURI,String qName) throws SAXException { // 在workr标签解析完之后,会打印出所有得到的数据 tagName = ""; if (localName.equals("CityWeatherResponse")) { System.out.println("end-----CityWeatherResponse"); flag = 0; // printout(); } else if (localName.equals("results")) { System.out.println("end-----results"); } else if (localName.equals("weather_data")) { System.out.println("end-----weather_data"); } else if (localName.equals("temperature")) { weatherInfos.add(weatherInfo); } } // 打开一个标签的内容 public void printout() { System.out.println("status: " + status); System.out.println("date: " + date); System.out.println("currentCity: " + currentCity); for (int i = 0; i < weatherInfos.size(); i++) { System.out.println(weatherInfos.get(i).toString()); } System.out.println(); } }由于百度车联网天气查询有两个date标签,所以在这里我用flag变量来控制。
天气实体类WeatherInfo.java
package com.dzt.weather; /** * 天气信息实体类 * * @author dzt 2014.04.12 * */ public class WeatherInfo { private String date; // 日期 private String dayPictureUrl; // 白天天气图片 private String nightPictureUrl; // 晚上天气图片 private String weather; private String wind; private String temperature; public WeatherInfo() { } public WeatherInfo(String date,String dayPictureUrl,String nightPictureUrl,String weather,String wind,String temperature) { this.date = date; this.dayPictureUrl = dayPictureUrl; this.nightPictureUrl = nightPictureUrl; this.weather = weather; this.wind = wind; this.temperature = temperature; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getDayPictureUrl() { return dayPictureUrl; } public void setDayPictureUrl(String dayPictureUrl) { this.dayPictureUrl = dayPictureUrl; } public String getNightPictureUrl() { return nightPictureUrl; } public void setNightPictureUrl(String nightPictureUrl) { this.nightPictureUrl = nightPictureUrl; } public String getWeather() { return weather; } public void setWeather(String weather) { this.weather = weather; } public String getWind() { return wind; } public void setWind(String wind) { this.wind = wind; } public String getTemperature() { return temperature; } public void setTemperature(String temperature) { this.temperature = temperature; } @Override public String toString() { return "WeatherInfo [date=" + date + ",dayPictureUrl=" + dayPictureUrl + ",nightPictureUrl=" + nightPictureUrl + ",weather=" + weather + ",wind=" + wind + ",temperature=" + temperature + "]"; } }
更多的代码我就不贴出来了,有需要的可以下载:http://download.csdn.net/detail/deng0zhaotai/7192795
声明下必须要有网络才能定位和获取天气信息。
今天(2014.05.05)在网上找到一个更详细的天气信息
http://wthrcdn.etouch.cn/weather_mini?city=深圳
通过城市名字获得天气数据,json数据
http://wthrcdn.etouch.cn/weather_mini?citykey=101280601
通过城市id获得天气数据,json数据
http://wthrcdn.etouch.cn/WeatherApi?citykey=101280601 通过城市id获得天气数据,xml文件数据,当错误时会有<error>节点 http://wthrcdn.etouch.cn/WeatherApi?city=深圳 通过城市名字获得天气数据,xml文件数据