【Android】 天气预报与空气质量

最近公司做的一个空气检测方面的大屏显示设备,需要获取网络上的天气情况,以及空气质量情况。对于天气,找到了中国天气网(http://openweather.weather.com.cn/Home/Help/Using.html),传说从前是免费的,在某个时刻,停止了更新,出来了新的政策,需要申请key令牌,费用为30元一年(现阶段是免费的,但不知道什么时候会收费,个人感觉比较不靠谱)。对于PM2.5空气质量的数据,找到了http://www.pm25.in,个人还是很喜欢他的界面的,他也需要申请AppKey,虽然他提供了一个公共测试用的AppKey,但是如果是运用到项目中,碰到频繁调用的情况下,稳定性还是让人担忧的,然后开始考虑写爬虫程序,将一些网页上的数据抠出来使用,目标指向了百度首页,但是总觉得好复杂,这种方法不靠谱,细想百度的数据来源,无意中发现了新大陆,使用百度的api可以同时获取到天气情况与pm2.5值,真的太方便了。下面来说说用法吧。

接口示例

http://api.map.baidu.com/telematics/v3/weather?location=城市名(城市名需要使用url编码格式)&output=json&ak=8uMaVBYB1BS79gkIBMzFMmnU

这里的ak需要申请,申请地址为http://lbsyun.baidu.com/apiconsole/key

此处附上申请AppKey的详细教程,点击打开链接

创建完成后,我们可以在API控制台中看到我的应用中已经有我们刚刚添加的应用,以及对应的AppKey了。

调用该请求,返回的json数据格式如下:

{
	"error":0,
	"status":"success",
	"date":"2014-12-03",
	"results":[
				{
					"currentCity":"无锡",
					"pm25":"95",
					"index":[
							{	
								"title":"穿衣",
								"zs":"冷",
								"tipt":"穿衣指数",
								"des":"天气冷,建议着棉服、羽绒服、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣、冬大衣或厚羽绒服。"
							},
							{
								"title":"洗车",
								"zs":"不宜",
								"tipt":"洗车指数",
								"des":"不宜洗车,未来24小时内有雨,如果在此期间洗车,雨水和路上的泥水可能会再次弄脏您的爱车。"
							},
							{
								"title":"旅游",
								"zs":"一般",
								"tipt":"旅游指数",
								"des":"天气稍凉,风稍大会加大些凉意,且预报有降水,旅游指数一般,外出旅游请注意防风保暖并携带雨具。"
							},
							{
								"title":"感冒",
								"zs":"易发",
								"tipt":"感冒指数",
								"des":"昼夜温差很大,易发生感冒,请注意适当增减衣服,加强自我防护避免感冒。"
							},
							{
								"title":"运动",
								"zs":"较不宜",
								"tipt":"运动指数",
								"des":"有降水,且风力较强,推荐您在室内进行低强度运动;若坚持户外运动,请注意保暖并携带雨具。"
							},
							{
								"title":"紫外线强度",
								"zs":"最弱",
								"tipt":"紫外线强度指数",
								"des":"属弱紫外线辐射天气,无需特别防护。若长期在户外,建议涂擦SPF在8-12之间的防晒护肤品。"
							}
						],
						"weather_data":[
							{
								"date":"周三 12月03日 (实时:6℃)",
								"dayPictureUrl":"http://api.map.baidu.com/images/weather/day/xiaoyu.png",
								"nightPictureUrl":"http://api.map.baidu.com/images/weather/night/duoyun.png",
								"weather":"小雨转多云",
								"wind":"北风3-4级",
								"temperature":"7 ~ -1℃"
							},
							{
								"date":"周四",
								"dayPictureUrl":"http://api.map.baidu.com/images/weather/day/duoyun.png",
								"nightPictureUrl":"http://api.map.baidu.com/images/weather/night/duoyun.png",
								"weather":"多云","wind":"西北风3-4级","temperature":"6 ~ -2℃"
							},
							{
								"date":"周五",
								"dayPictureUrl":"http://api.map.baidu.com/images/weather/day/duoyun.png",
								"nightPictureUrl":"http://api.map.baidu.com/images/weather/night/duoyun.png",
								"weather":"多云",
								"wind":"西北风3-4级",
								"temperature":"7 ~ -1℃"
							},
							{
								"date":"周六",
								"dayPictureUrl":"http://api.map.baidu.com/images/weather/day/duoyun.png",
								"nightPictureUrl":"http://api.map.baidu.com/images/weather/night/duoyun.png",
								"weather":"多云",
								"wind":"北风3-4级",
								"temperature":"9 ~ -1℃"
							}
						]
				}
			]
}



我们就可以通过Java代码发出Http请求,获取这个返回结果,代码如下

String str = "http://api.map.baidu.com/telematics/v3/weather?location="+URLEncoder.encode(cityName, "utf-8")+"&output=json&ak=jf9ZX7hwsDT3GpBBXhwn6aoM";
				URL url = new URL(str);
				HttpURLConnection connection = (HttpURLConnection)url.openConnection();
				connection.setDoInput(true);	//允许从服务器接收数据
				connection.setConnectTimeout(3000);	//设置请求超时时间,毫秒为单位
				
				if(connection.getResponseCode() == 200){
					InputStream is = connection.getInputStream();
					InputStreamReader ir = new InputStreamReader(is);
					BufferedReader br = new BufferedReader(ir);
					
					String line = "";
					StringBuilder builder = new StringBuilder();
					while((line = br.readLine()) != null){
						builder.append(line);
					}
					
					br.close();
					ir.close();
					is.close();
					Log.e("hehe", builder.toString());

运行这段代码,会发现服务器端返回的数据并不是我们要的数据,而是 {"status":102,"message":"MCODE参数不存在,mobile类型mcode参数必需"}
意思是需要为请求配置mcode参数,之前加不加mcode参数都无所谓的,都能获取准确的数据,昨天被客户叫过去说获取不到数据,发现返回的始终是这段返回值,所以只能将mcode参数加上,mcode参数就是安全码,安全码由数字签名+;+包名组成,就是申请AppKey时填写的安全码,我们可以在API控制台,点击项目的设置,获取这个安全码

【Android】 天气预报与空气质量_第1张图片


我们将mcode添加进请求上,如下

http://api.map.baidu.com/telematics/v3/weather?location=%E6%97%A0%E9%94%A1&mcode=数字签名;包名&output=json&ak=jf9ZX7hwsDT3GpBBXhwn6aoM

重新运行代码就可以得到我们需要的天气信息了。

【Android】 天气预报与空气质量_第2张图片


你可能感兴趣的:(android开发)