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的数据库,其中的表结构如下:
其中只存在两个表:provices和citys
City中存在city_num用天气的查询,同时还存在外键province_id与provices表形成1对n的关系。
四、主要功能实现
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地址封装对象。最后由实例化的Geocoder将Location中的经度和纬度反编译为地址信息集合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小时内删除。
发表评论