您的位置:首页 > 移动开发 > Android开发

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

2014-12-03 16:50 183 查看
最近公司做的一个空气检测方面的大屏显示设备,需要获取网络上的天气情况,以及空气质量情况。对于天气,找到了中国天气网(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";
<span style="white-space:pre">				</span>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控制台,点击项目的设置,获取这个安全码



我们将mcode添加进请求上,如下
http://api.map.baidu.com/telematics/v3/weather?location=%E6%97%A0%E9%94%A1&mcode=数字签名;包名&output=json&ak=jf9ZX7hwsDT3GpBBXhwn6aoM
重新运行代码就可以得到我们需要的天气信息了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息