天天看点

android天气预报获取-气象台webservice

一、之前项目需要获取天气预报,然而各个API对免费访问次数都有限制,试了很多种方法,决定使用气象台webservice获取。

二、气象台服务的大概情况:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx是由中国气象台提供的通过webservice获取天气预报Web服务,据每2.5小时左右自动更新一次,准确可靠。包括 340 多个中国主要城市和 60 多个国外主要城市三日内的天气预报数据。WebService上提供了多个方法,我们这里要查的是国内城市的天气预报,就用getWeatherbyCityName 这个方法,调用方法如下:输入参数:theCityName = 城市中文名称(国外城市可用英文)或城市代码(不输入默认为上海市),如:上海 或 58367,如有城市名称重复请使用城市代码查询(可通过 getSupportCity 或 getSupportDataSet 获得);返回数据是一个xml形式的数据,用工具解析一下就行了。获取数据的方式也有多种,比如http post/get/soap等,想了解多种方式的可以去webservice上看一下,我用的是http get方法,比较方便。

三、这种方法的优缺点:

1.优点:

1)虽然这种方法仍有访问限制,但由于这种方法不需要传访问Key,访问次数是根据访问IP统计的,所以每台手机每天访问次数都是足够的。PS:这个问题是我在一天不停调试该App请求太多次发现的,一般用户不会没事每天不停打开你的应用,所以这种影响可以忽略;要是你在调试过程中发生这种情况,也可以直接重启设备,又可以正常访问了。

2)返回的数据格式固定(暂时没发现格式变化)而且,我的这种方式访问回来的是xml格式的数据,自己用工具解析一下就好了。

3)输入参数是城市的中文名称,无需用城市代码转换。

2.缺点:

1)因为是免费的服务,所以比付费的服务相对不稳定,我完成到现在两个月的时间,只发现有两天是显示系统维护而取不到数据的。

2)不确定这个服务什么时候会被关闭,所以还是比较适合刚起步的应用或者个人开发。

四、代码:

首先要说明的是,我这里是根据项目需要来解析数据的,我这里只是取了现在的温度和对应的天气图标,但是返回的数据有今明两天比较具体的数据,后面再把数据贴出来。

<pre name="code" class="java">/**获取天气*/
	private void loadWeather(){
		new Thread(runNow).start();
	}
	Runnable runNow =new Runnable(){

		@Override
		public void run() {
			try {

				URL url = new URL(WSDL + cityname);
				HttpURLConnection conn = (HttpURLConnection)url.openConnection();
		        conn.setConnectTimeout(5*1000);
		        conn.setRequestMethod("GET");
		        InputStream inStream = conn.getInputStream();  
		        
		        XmlPullParser parser = AbstractPullParser.createXmlPullParser(inStream);
		        List<String> weatherList = new ArrayList<String>();
		        int event = parser.getEventType();
				while (event != XmlPullParser.END_DOCUMENT && event != XmlPullParser.END_TAG) {
					switch (event) {
					case XmlPullParser.START_DOCUMENT:
						break;
					case XmlPullParser.START_TAG:
						if ("string".equalsIgnoreCase(parser.getName())) {
							weatherList.add(parser.nextText());
						}
						break;
					default:
						break;
					}
					event = parser.next();
				}
				if(weatherList.size() > 0){				
					tempStr = weatherList.get(10);
					Pattern pattern = Pattern.compile("[0-9]*℃");
					Matcher matcher = pattern.matcher(tempStr);
					if(matcher.find()){
						tempStr = matcher.group(0);
					}else{
						tempStr = "";
					}
					Message msg =new Message(); 
					msg.what = 1;
					msg.obj = getImageBitMap(weatherList.get(9));
					mHandler.sendMessage(msg);
				}else{
					Message msg =new Message(); 
					msg.what = 0;
					msg.obj = GONE;
					mHandler.sendMessage(msg);
				}
			} catch (Exception e) {
				Message msg =new Message(); 
				msg.what = 0;
				msg.obj = GONE;
				mHandler.sendMessage(msg);
			}
		}
		
	};
	/**获取天气之后更新UI*/
	Handler mHandler = new Handler() {  
		  
        @Override  
        public void handleMessage(Message msg) {  
            super.handleMessage(msg);  
            switch (msg.what) {  
            case 0:  
            	setVisibilityView(GONE); 
                break; 
            case 1:  
            	setVisibilityView(VISIBLE);
            	weatherTv.setText(tempStr);
            	weatherimageM.setImageBitmap((Bitmap) msg.obj);
                break; 
            default:  
                break;  
            }  
        }  
  
    }; 
	/**获取assets图片*/
	private Bitmap getImageBitMap(String name){
		String fileName = "weatherIconNew/"+name;
		Bitmap image = null;  
	    AssetManager am = getResources().getAssets();  
	    try{  
	          InputStream is = am.open(fileName);  
	          image = BitmapFactory.decodeStream(is);  
	          is.close();  
	    }  
	    catch (IOException e){  
	          e.printStackTrace();  
	    }
	    return image; 
	}
           

五、返回数据解析:

返回的数据:

<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://WebXml.com.cn/">
<string>广东</string>
<string>广州</string>
<string>59287</string>
<string>59287.jpg</string>
<string>2016-4-16 17:01:04</string>
<string>22℃/27℃</string>
<string>4月16日 小雨</string>
<string>无持续风向微风</string>
<string>7.gif</string>
<string>7.gif</string>
<string>今日天气实况:气温:27℃;风向/风力:东南风 2级;湿度:79%;紫外线强度:最弱。空气质量:良。</string>
<string>
紫外线指数:最弱,辐射弱,涂擦SPF8-12防晒护肤品。 感冒指数:较易发,天凉,湿度大,较易感冒。 穿衣指数:舒适,建议穿长袖衬衫单裤等服装。 洗车指数:不宜,有雨,雨水和泥水会弄脏爱车。 运动指数:较不宜,有降水,推荐您在室内进行休闲运动。 空气污染指数:良,气象条件有利于空气污染物扩散。
</string>
<string>19℃/27℃</string>
<string>4月17日 中到大雨</string>
<string>无持续风向微风</string>
<string>22.gif</string>
<string>22.gif</string>
<string>19℃/24℃</string>
<string>4月18日 阴转多云</string>
<string>无持续风向微风</string>
<string>2.gif</string>
<string>1.gif</string>
<string>
广州是广东省的省会,是中国南方最大的海滨城市,广州位于东经113。17`,北纬23。8`,地处中国大陆南部,广东省南部,珠江三角洲北缘。广州临南海,邻近香港特别行政区,是中国通往世界的南大门,广州属丘陵地带。中国的第三大河----珠江从广州市中心穿流而过。广州是一座历史文化名城。相传在远古时候,曾有五位仙人,身穿五色彩服、骑着嘴衔稻穗的五色仙羊降临此地,把稻穗赠给百姓,祝愿这里永无饥荒。从此,广州便有“羊城”、“穗城”的美称,“五羊”也成为广州的象征。广州既是中国也是世界名城,又是一座古城,因历史上有五羊仙子降临献稻穗的故事,广州又称为“羊城”和“穗城”,简称“穗”;广州一年四季如春、繁花似锦,除夕迎春花市闻名海内外,故又有“花城”的美誉。广州地处低纬,属南亚热带季风气候区。地表接受太阳辐射量较多,同时受季风的影响,夏季海洋暖气流形成高温、高湿、多雨的气候;冬季北方大陆冷风形成低温、干燥、少雨的气候。年平均气温为21.4-21.9度,年降雨量平均为1623.6-1899.8mm,北部多于南部。1982年,广州被国务院选定为全国首批历史文化名城之一,是我国重点旅游城市。1999年1月,广州被评为优秀旅游城市。景观:白云山、莲花山、南海神庙、佛山祖庙、广州动物园等。
</string>
</ArrayOfString>
           

返回的数据是今明两天的数据,个人调用至今数据的格式还没变过,所以暂时还能放心使用。我这里是将XML的数据解析进List里面,在

<string>今日天气实况:气温:27℃;风向/风力:东南风 2级;湿度:79%;紫外线强度:最弱。空气质量:良。</string>
           

中通过正则表达式获取当前温度,当然需要温度范围的就比较简单,直接获取就好。具体的数据解析就不细说了,自己看着返回的数据解析吧。

在这里还要说一下天气的图标使用,http://www.webxml.com.cn/zh_cn/weather_icon.aspx这个地址是图标的说明,需要自定义图标的可根据图标的天气解释自己做一些图标,然后改成对应的名字即可。