一、之前项目需要获取天气预报,然而各个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(){@Overridepublic 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这个地址是图标的说明,需要自定义图标的可根据图标的天气解释自己做一些图标,然后改成对应的名字即可。

android天气预报获取-气象台webservice相关推荐

  1. Android studio获取服务器端json数据——天气预报(仅读取了json文件尚未分析)

    Android studio获取服务器端json数据--天气预报 MainActivity.java import androidx.appcompat.app.AppCompatActivity;i ...

  2. Android之通过向WebService服务器发送XML数据获取相关服务

    原理图如下: 即客户端向WebService服务器通过HTTP协议发送XML数据(内部包含调用的一些方法和相关参数数据),然后WebService服务器给客户端返回一定的XML格式的数据,客户端通过解 ...

  3. Android天气预报开发

    Android天气预报开发(2) 在上节我们讲到了Android天气预报开发的数据该怎么获取,在看了上节的具体介绍,我们就知道了要从哪里拿数据,该如何拿数据?当拿到数据后我们就可以进行进一步的开发了. ...

  4. Android 天气预报源码

    2019独角兽企业重金招聘Python工程师标准>>> 这是一个Android 天气预报的源码,有兴趣的可以看看! 关于天气的源码: 转载:http://www.adobex.com ...

  5. Android实例]------获取sd卡图片显示出来

    [Android实例] 获取sd卡图片显示出来 ON 六 02 2012 IN ANDROID代码仓库, ANDROID项目代码 BY ANDROID智能手机 | 评论 package com.fil ...

  6. android如何获取listview中的任意行数据

    android如何获取listview中的任意行数据 @Override public void onItemClick(AdapterView<?> arg0, View arg1, i ...

  7. android camera2获取摄像头支持的分辨率

    android camera2 获取摄像头支持的分辨率 41的for循环我注释了,代码是获取最匹配的分辨率. private Size getMatchingSize2(){Size selectSi ...

  8. android url webview,android - webview获取到当前页面的url

    android - webview获取到当前页面的url 2017-10-23 08:54 访问量: 2958 分类: 技术 使用 webview.getUrl() 即可. 可以完美返回  a.com ...

  9. Android杂谈---获取手机屏幕大小

    Android杂谈---获取手机屏幕大小 SurfaceView简单例子 玩转Android---UI篇---ZoomControls放大缩小图片 更多相关推荐 这里总结下android中关于手机屏幕 ...

最新文章

  1. linux 下,解决tomcat服务器接收中文乱码的问题
  2. numpy ndarray.tostring()(在数组中构造包含原始数据字节的Python字节)(tobytes()函数的兼容性别名)
  3. 为什么 Rust 连续 4 年获「最受喜爱编程语言」?
  4. windows “文件大小”与“占用空间”、文件系统与文件拷贝
  5. 第四讲 移动互联网接入技术
  6. ydui滚动加载:TypeError: Cannot read property '$emit' of undefined
  7. 牛客网--23803--DongDong认亲戚
  8. __DSB()指令的作用
  9. Day739.GEO经纬度数据结构自定义数据结构 -Redis 核心技术与实战
  10. Additive smoothing
  11. win7下通过easyBCD引导安装Ubuntu14.04(补充完善版)
  12. NS2 队列管理机制
  13. 华为OD机试真题2022(JAVA)
  14. 网络基础:套接字编程,UDP和TCP通信程序
  15. 明光市机器人_明光市情侣酒店客房语音智能控制系统厂家
  16. 逃脱只会部署集群系列 —— Kubeadm部署v1.18.0与ETCD操作
  17. 值得纪念的一天,终于进了大厂
  18. 云服务器维护成本,云服务器维护成本
  19. html 多层画布,HTML画布——canvas
  20. 2021年春招首发!阿里云云原生实习一二三面面经,看完的都进阿里了!

热门文章

  1. 父母该怎样对待孩子?
  2. Vue3+TypeScript+Vite 学习笔记(持续更新中)
  3. Latex图表中英文双标注之多个子图
  4. JVM内存中的年轻代,老年代
  5. Markdown 文字颜色代码卡 (自用超好看)
  6. 使用 SVG 和 JS 创建一个由星形变心形的动画
  7. 残差结构Residual、BN(Batch Normalization)
  8. OpenMV入门介绍
  9. 常用的计算机有哪些台式的还有哪些,现在台式电脑的主流配置有哪些?
  10. uniapp 可搜索下拉框