【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";
<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

重新運行代碼就可以得到我們需要的天氣信息了。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章