在项目中有一个天气预报的需求,在网上找了找大部分人给出的建议是使用webservice方式来获取数据。于是就尝试着做了一下,真是不做不知道,做了就收获了很多。
首先,来说一下通过webservice来获取国家气象局提供的天气服务
在Android SDK中并没有提供调用WebService的库,因此,需要使用第三方的SDK来调用WebService。适合手机的WebService客户端的SDK有一些,比较常用的是KSOAP2。(强烈建议大家去官网上下载http://code.google.com/p/ksoap2-android/。博主之前随便找了一个,结果是引用的sdk存在问题。坑死人啊。)注意,一定要下载正确的jar包。
http://code.google.com/p/ksoap2-android/source/browse/m2-repo/com/google/code/ksoap2-android/ksoap2-android-assembly/2.5.4/ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar 点 View raw file 正确下载对应文件。
好了,下面直接上代码(这里只做简单的介绍)
public class MyWeather extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//展现天气预报的具体数据
showWeather("北京");
}
//展现天气预报的具体数据
private void showWeather(String city)
{
String weatherToday = null;
int iconToday[] = new int[2];
// 获取远程Web Service返回的对象
SoapObject detail = WebServiceUtil.getWeatherByCity(city);// 根据城市获取城市具体天气情况
// 获取天气实况
weatherCurrent = detail.getProperty(4).toString();
// 解析今天的天气情况
String date = detail.getProperty(7).toString();
weatherToday = "今天:" + date.split(" ")[0];
weatherToday = weatherToday + "\n天气:" + date.split(" ")[1];
weatherToday = weatherToday + "\n气温:"
+ detail.getProperty(8).toString();
weatherToday = weatherToday + "\n风力:"
+ detail.getProperty(9).toString() + "\n";
iconToday[0] = parseIcon(detail.getProperty(10).toString());
iconToday[1] = parseIcon(detail.getProperty(11).toString());
}
// 工具方法,该方法负责把返回的天气图标字符串,转换为程序的图片资源ID。
private int parseIcon(String strIcon)
{
if (strIcon == null)
return -1;
if ("0.gif".equals(strIcon))
return R.drawable.a_0;
if ("1.gif".equals(strIcon))
return R.drawable.a_1;
if ("2.gif".equals(strIcon))
return R.drawable.a_2;
if ("3.gif".equals(strIcon))
return R.drawable.a_3;
if ("4.gif".equals(strIcon))
return R.drawable.a_4;
if ("5.gif".equals(strIcon))
return R.drawable.a_5;
if ("6.gif".equals(strIcon))
return R.drawable.a_6;
if ("7.gif".equals(strIcon))
return R.drawable.a_7;
if ("8.gif".equals(strIcon))
return R.drawable.a_8;
if ("9.gif".equals(strIcon))
return R.drawable.a_9;
if ("10.gif".equals(strIcon))
return R.drawable.a_10;
if ("11.gif".equals(strIcon))
return R.drawable.a_11;
if ("12.gif".equals(strIcon))
return R.drawable.a_12;
if ("13.gif".equals(strIcon))
return R.drawable.a_13;
if ("14.gif".equals(strIcon))
return R.drawable.a_14;
if ("15.gif".equals(strIcon))
return R.drawable.a_15;
if ("16.gif".equals(strIcon))
return R.drawable.a_16;
if ("17.gif".equals(strIcon))
return R.drawable.a_17;
if ("18.gif".equals(strIcon))
return R.drawable.a_18;
if ("19.gif".equals(strIcon))
return R.drawable.a_19;
if ("20.gif".equals(strIcon))
return R.drawable.a_20;
if ("21.gif".equals(strIcon))
return R.drawable.a_21;
if ("22.gif".equals(strIcon))
return R.drawable.a_22;
if ("23.gif".equals(strIcon))
return R.drawable.a_23;
if ("24.gif".equals(strIcon))
return R.drawable.a_24;
if ("25.gif".equals(strIcon))
return R.drawable.a_25;
if ("26.gif".equals(strIcon))
return R.drawable.a_26;
if ("27.gif".equals(strIcon))
return R.drawable.a_27;
if ("28.gif".equals(strIcon))
return R.drawable.a_28;
if ("29.gif".equals(strIcon))
return R.drawable.a_29;
if ("30.gif".equals(strIcon))
return R.drawable.a_30;
if ("31.gif".equals(strIcon))
return R.drawable.a_31;
return 0;
}
}
下面就来说一下访问中央气象台的天气预报API得到天气数据
使用这个服务唯一的缺点就是获取对应的城市码,这个有点麻烦(不过可以在这里下载http://download.csdn.net/tag/%E4%B8%AD%E5%9B%BD%E5%A4%A9%E6%B0%94%E7%BD%91%E5%9F%8E%E5%B8%82%E4%BB%A3%E7%A0%81%E6%95%B4%E7%90%86%E7%89%88.txt)其它的如稳定性与广阔性也是很一流的,它可以精确到县和区.下面就直奔主题:
这个服务的天气预报的请求地址是:http://m.weather.com.cn/data/101091106.html,这个文本就是城市天气URL,101091106代表的为对应地区的编码,执行URL,得到一个返回文本,是JSON格式的,如下(经过格式化):
{"weatherinfo":
{"city":"北戴河",
"city_en":"beidaihe",
"date_y":"2013年7月31日",
"date":"",
"week":"星期三",
"fchh":"18",
"cityid":"101091106",
"temp1":"23℃~28℃",
"temp2":"23℃~27℃",
"temp3":"25℃~28℃",
"temp4":"25℃~30℃",
"temp5":"25℃~29℃",
"temp6":"25℃~28℃",
"tempF1":"73.4℉~82.4℉",
"tempF2":"73.4℉~80.6℉",
"tempF3":"77℉~82.4℉",
"tempF4":"77℉~86℉",
"tempF5":"77℉~84.2℉",
"tempF6":"77℉~82.4℉",
"weather1":"晴转雷阵雨",
"weather2":"小雨",
"weather3":"中雨转小雨",
"weather4":"小雨",
"weather5":"多云转晴",
"weather6":"晴转阴",
"img1":"0",
"img2":"4",
"img3":"7",
"img4":"99",
"img5":"8",
"img6":"7",
"img7":"7",
"img8":"99",
"img9":"1",
"img10":"0",
"img11":"0",
"img12":"2",
"img_single":"4",
"img_title1":"晴",
"img_title2":"雷阵雨",
"img_title3":"小雨",
"img_title4":"小雨",
"img_title5":"中雨",
"img_title6":"小雨",
"img_title7":"小雨",
"img_title8":"小雨",
"img_title9":"多云",
"img_title10":"晴",
"img_title11":"晴",
"img_title12":"阴",
"img_title_single":"雷阵雨",
"wind1":"微风",
"wind2":"微风",
"wind3":"西南风3-4级",
"wind4":"微风",
"wind5":"微风",
"wind6":"东南风转西南风3-4级",
"fx1":"微风",
"fx2":"微风",
"fl1":"小于3级",
"fl2":"小于3级",
"fl3":"3-4级",
"fl4":"小于3级",
"fl5":"小于3级",
"fl6":"3-4级",
"index":"热",
"index_d":"天气热,建议着短裙、短裤、短薄外套、T恤等夏季服装。",
"index48":"舒适","index48_d":"建议着长袖T恤、衬衫加单裤等服装。年老体弱者宜着针织长袖衬衫、马甲和长裤。",
"index_uv":"弱","index48_uv":"最弱",
"index_xc":"不宜","index_tr":"一般","index_co":"较不舒适",
"st1":"26","st2":"23","st3":"25","st4":"21","st5":"25","st6":"21",
"index_cl":"较不宜","index_ls":"不宜","index_ag":"极不易发"
}
}
主要向大家介绍一下jsonObject类(http://henzil.easymorse.com/?p=242)
JSONObject jsonObject = new JSONObject(jsonString)..getJSONObject("weatherinfo");其中的jsonString就是获取的字符串
例如得到天气图片
String imgurl = jsonObject.getString("img1");然后通过这个拼串就可以得到图片了
http://m.weather.com.cn/img/b+ imgurl +".gif"
上面就是两种方式获取天气情况了,欢迎大家给出意见或建议