Android天气预报系统
    院:计算机与信息工程学院
    级:10软件技术1
    名:刘站稳
    号:10060401029
指导教师:陈建彪
一、设计目标
设计完成一个实用稳定的天气预报系统,同时使其能满足大部分用户的需求。因此针对上述要求,本设计应满足:
1.系统能及时的反馈指定预报城市的天气情况
2.自动定位用户所在城市,支持GPS定位
3.节省流量开梢.规定在指定的时间间隔内才更新天气,其它时段显示缓存的天气
4.操作方便快捷,使用简单,界面设计美观大方,支持widget
二、开发及运行环境
JDK  1.6
Eclipse
ADT 16.0及以上
Android 2.2及以上
Window XP及以上
三、数据库设计
由于在本系统中是通过中央气象台的WebService提供的API访问得到的天气预报,在查询指定城市的天气时,需要用到它提供的城市码,而城市码相对稳定不变,所以在构建系统
时将其事先通过Android的网络访问技术将其缓冲到本地SQLite数据库进行保存起来,方便以后的查询,同时节省了流量开销.综上所述在本地建立db_weather.db的数据库,其中的表结构如下:
其中只存在两个表:provicescitys
City中存在city_num用天气的查询,同时还存在外键province_idprovices表形成1n的关系。
四、主要功能实现
1.获取城市码db_weather.db数据库文件
获取全国各地的城市码,是通过访问中央气象局网从省份直辖市到城镇一级一级深入得到的,获得一个地区的城市码总共需要访问4次网络。
1. 访问m.weather/l得到省份直辖市列表与它的编号:
2.访问m.weather/dat5/city<省份编号>.xml得到该省份直辖市的城市编号(如访问山东:m.weather/l
eclipse android
3.访问m.weather/dat5/city<城市编号>.xml得到该城市的县区编号(如访问济南:m.weather/l
4.访问m.weather/dat5/city<县区编号>.xml得到该县区的编号编号(如访问长清:m.weather/l
首先实现上述功能需使用Android的网络访问技术,故编写工具类WebAccessTools类如下:
public class WebAccessTools {
    private Context context;
public WebAccessTools(Context context) {
        t = context;
    }
    /**
    * 根据给定的url地址访问网络,得到响应内容(这里为GET方式访问)
    * @param url 指定的url地址
    * @return web服务器响应的内容,为<code>String</code>类型,当访问失败时,返回为null
    */
    public  String getWebContent(String url) {
        //创建一个http请求对象
        HttpGet request = new HttpGet(url);
        //创建HttpParams以用来设置HTTP参数
        HttpParams params=new BasicHttpParams();
        //设置连接超时或响应超时
        //HttpConnectionParams.setConnectionTimeout(params, 3000);
        //HttpConnectionParams.setSoTimeout(params, 5000);
        //创建一个网络访问处理对象
        HttpClient httpClient = new DefaultHttpClient(params);
        try{
            //执行请求参数项
            HttpResponse response = ute(request);
            //判断是否请求成功
            StatusLine().getStatusCode() == HttpStatus.SC_OK) {
                //获得响应信息
                String content = Entity());
                return content;
            } else {
                //网连接失败,使用Toast显示提示信息
                Toast.makeText(context, "网络访问失败,请检查您机器的联网设备!", Toast.LENGTH_LONG).show();
            }
        }catch(Exception e) {
            e.printStackTrace();
        } finally {
            //释放网络连接资源
            ConnectionManager().shutdown();
        }
        return null;
    }
}
2.GPS定位功能的实现
Android中调用GPS功能,首先要获取GPS定位管理器LocationManager,获取LocationManager后就是获取助LocationProvider,可以通过Criteria对象设置过滤条件来获得最符合用户需求的LocationProvider,得到LocationProvider后就可通过调用LocationManager对象的getLastKnownLocation()方法来获取Location地址封装对象。最后由实例化的GeocoderLocation中的经度和纬度反编译为地址信息集合List对象。从而由List对象来得到当前用户地址名。在开发过程中通过Eclipse中的ADT抽件的DDMS可以为Android模拟器指定任意地址,如下:
使用的代码如下:
由此可知,为了实现GPS的定位功能还需要实现一个解析XML的工具类,在本系统中由工具类LocationXMParser完成,它继承至l.sax.helpers.DefaultHandler类。用于专门用于解析XMI文件。
public synchronized Map<Integer, String> getLocationCityInfo() {
        LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
       
        //设置一个Criteria标准用于过滤LocationProvider
        Criteria criteria = new Criteria();
        //设置不需要高度信息
        criteria.setAltitudeRequired(false);
        //设置不需要方位信息
        criteria.setBearingRequired(false);
        //设置得到的为免费
        //criteria.setCostAllowed(false);
       
        //得到最好的可用的Provider
        String provider = BestProvider(criteria, true);
        //得到当前的位置对象
        Location location = LastKnownLocation(provider);
        if(location!=null) {
            double latitude = Latitude();  //得到经度
            double longitude = Longitude(); //得到纬度
            //根据经纬度得到详细的地址信息
            //定义的一个网络访问工具类
            WebAccessTools webTools = new WebAccessTools(this);
            String addressContext = WebContent("le/maps/geo?output=xml&q="+latitude+","+longitude);
            //解析地址信息
            SAXParserFactory spf = wInstance();
            try {
                SAXParser parser = wSAXParser();
                XMLReader reader = XMLReader();
                LocationXMLParser handler = new LocationXMLParser();
                reader.setContentHandler(handler);
               
                StringReader read = new StringReader(addressContext);
                // 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
                InputSource source = new InputSource(read);
               
                //开始解析
                reader.parse(source);
                //判断是否存在地址
                if(handler.hasAddress())
                    DetailAddress();
            } catch (ParserConfigurationException e) {

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。