对于开发人员而言,取天气信息这是一个很常用的功能,要取到天气,首先要取到位置信息即经纬度。
怎样实现在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是在第二步中实现的。
第四步,将天气代码解析出来,这个非常简单。
转载于:https://blog.51cto.com/yanglinux/1132534