對於開發人員而言,取天氣信息這是一個很常用的功能,要取到天氣,首先要取到位置信息即經緯度。
怎樣實現在android的平板上取到位置信息?我們有三種常用方式:第一種、通過wifi得到經緯度;第二種、通過基站:這個需要在手機和平板上安裝sim卡;第三種、通過GPS:在室內難以取到,在室外才行。(需要說明的是谷歌的https ://www.google.com/loc/json取地址已經停用了。)
由於方式2要依賴SIM卡,方式3在室內效果太差,並且我們上網經常是通過wifi,所以這種方式最常用,我們就採用此方式。其實通過wifi上網時,google maps和baidu maps是通過無線路由器的mac地址(而不是wifi信號)定位的,這個原理網上有高人測試過,見http://www.diypda.com/forum.php?mod=viewthread&tid=114364&page=1
因爲google地圖由於GFW的原因不太好用,所以我們大方的採用baidu的API。
1、設置AndroidManfest.xml權限
<!-- 訪問網絡的權限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 訪問精確位置的權限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 訪問網絡狀態的權限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 訪問WIFI網絡狀態的權限 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 改變WIFI網絡狀態的權限 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
2、導入baidumapapi.jar包
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.LocationListener;
3、初始化設置BMapManager
mapManager = new BMapManager(this);
mapManager.init("授權key",new MKGeneralListener());
//mapManager.getLocationManager().setNotifyInternal(20, 5);
4、獲取經緯度
mapManager.getLocationManager().requestLocationUpdates(new MyLocationListener());
mapManager.start();
在LocationListener中獲取經緯度
class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location arg0) {
System.out.println(arg0.getLongitude());//經度
System.out.println(arg0.getLatitude());//緯度
}
}
這樣我們終於完成了取經緯度的動作,是爲取天氣的第一步。
第二步,通過經緯度獲取Yahoo 代表城市的WOEID,例如我通過第一步取到我所在位置的經緯度分別爲30.459723和114.427391,則通過地址
http://where.yahooapis.com/geocode?q=30.459723,+114.427391&gflags=R&appid=NrTfYV7e 可以返回一個詳細的xml文件。
第三步,通過yahoo取得真實的天氣信息(代碼表示)
方式是訪問地址http://weather.yahooapis.com/forecastrss?w=2163866&u=f ,其中2163866是在第二步中實現的。
第四步,將天氣代碼解析出來,這個非常簡單。