对于开发人员而言,取天气信息这是一个很常用的功能,要取到天气,首先要取到位置信息即经纬度。


怎样实现在android的平板上取到位置信息?我们有三种常用方式:第一种、通过wifi得到经纬度;第二种、通过基站:这个需要在手机和平板上安装sim卡;第三种、通过GPS:在室内难以取到,在室外才行。(需要说明的是谷歌的https ://www.google.com/loc/json取地址已经停用了。


由于方式2要依赖SIM卡,方式3在室内效果太差,并且我们上网经常是通过wifi,所以这种方式最常用,我们就采用此方式。其实通过wifi上网时,google mapsbaidu maps是通过无线路由器的mac地址(而不是wifi信号)定位的,这个原理网上有高人测试过,见http://www.diypda.com/forum.php?mod=viewthread&tid=114364&page=1

         因为google地图由于GFW的原因不太好用,所以我们大方的采用baiduAPI


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.459723114.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是在第二步中实现的。


 

第四步,将天气代码解析出来,这个非常简单。