微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > 如何通过网络确定当前时区-2

如何通过网络确定当前时区-2

时间:10-02 整理:3721RD 点击:
3 解析时区XML文件
目前android系统中timezone id与country code的对应关系在这个xml文件中
time_zones_by_country.xml,这里需要为每个时区加上经纬度信息,即该时区城市的经纬度。
3.1 获取时区城市的经纬度
可以通过google提供的接口查询:
请求数据:
http://maps.google.com/maps/api/geocode/xml?sensor=false&address={address}
参数{address}:需要查询的城市或地区名称,需要使用UTF8编码
返回数据:
数据格式:XML
数据内容实例:
<GeocodeResponse>
<status>OK</status>
<result>
<type>locality</type>
<type>political</type>
<formatted_address>中国广东省深圳</formatted_address>
<address_component>
<long_name>深圳</long_name>
<short_name>深圳</short_name>
<type>locality</type>
<type>political</type>
</address_component>
<address_component>
<long_name>广东省</long_name>
<short_name>广东省</short_name>
<type>administrative_area_level_1</type>
<type>political</type>
</address_component>
<address_component>
<long_name>中国</long_name>
<short_name>CN</short_name>
<type>country</type>
<type>political</type>
</address_component>
<geometry>
<location>
<lat>22.5430990</lat>
<lng>114.0578680</lng>
</location>
<location_type>APPROXIMATE</location_type>
<viewport>
<southwest>
<lat>22.3293893</lat>
<lng>113.7524414</lng>
</southwest>
<northeast>
<lat>22.7809313</lat>
<lng>114.3553162</lng>
</northeast>
</viewport>
<bounds>
<southwest>
<lat>22.4458841</lat>
<lng>113.7531974</lng>
</southwest>
<northeast>
<lat>22.8617484</lat>
<lng>114.6269898</lng>
</northeast>
</bounds>
</geometry>
</result>
</GeocodeResponse>
解析XML
使用XmlPullParser进行解析即可,需要注意的是,获取的数据为城市经纬度信息:
<location>
<lat>22.5430990</lat>
<lng>114.0578680</lng>
</location>
3.2 添加经纬度到时区XML文件
在时区xml文件中,为每个timezone添加经纬度信息,即lat和lon属性,添加后的最终效果如下(中国部分):
3.3 编写时区xml文件解析类
Android中有3中方式进行xml解析,这里使用XmlPullParser比较好;需要解析xml文件中的所有信息,具体使用方法可以参考网络上的相关代码或mtk提供的示例代码。
4 查询最匹配的时区
4.1 使用地理位置信息构建新的数据,ISO、latitude、Longitude
根据第2步中获取的当前的地理位置信息,构造一个class用于保存这些信息;
public class MyLocationInfo {
String mCityName;
String mCountryName;
double mLat;
double mLon;
String mISO;
String mState;
}
4.2 根据时区XML文件构造查询数组
构造一个List用于保存xml文件中解析出来的时区信息
List<Zone> zones = new ArrayList<Zone>();
其中每个时区解析出来的信息保存到下面的这个class中:
public class Zone {
private String iso;
private String id;
private String city;
private double lat;
private double lon;
}
4.3 在数组中寻找最符合条件的时区
4.3.1 比较iso
iso相等或不确定时才去判断距离。
对于传入参数countryCode不正确或为null的情况处理:
if (countryCode.length() != 2 || countryCode == null) {
countryCode = "XX";
}
开始将传入参数和每一个时区进行对比,比较iso:
for (Zone tz : zones) {
if (countryCode.equals("XX") || countryCode.equals(tz.getIso())){
……
}
4.3.2 寻找距离最近的时区
在满足iso条件的情况下,寻找距离更近的时区并记录下来,下面的代码处于上面的if语句中:
double la = tz.getLat();
double lo = tz.getLon();
double dis = GetDistance(lati, longi, la, lo);
if (dis < minD) {
minD = dis;
nearZone = tz;
tzid = nearZone.getId();
}
这样在for (Zone tz : zones)循环完成后就找到了最近的时区的时区id:tzid。
4.3.3 附:通过经纬度计算两点距离
因为地球是个球形,当距离较远的时候需要考虑到地面不是直线,计算的时候要使用球面上两点间的距离公式进行计算

private double EARTH_RADIUS = 6378.137;// 地球半径
private double rad(double d) {
return d * Math.PI / 180.0;
}
private double GetDistance(double lat1, double lng1, double lat2,double
lng2) {
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double a = radLat1 - radLat2;
double b = rad(lng1) - rad(lng2);
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
+ Math.cos(radLat1) * Math.cos(radLat2)
* Math.pow(Math.sin(b / 2), 2)));
s = s * EARTH_RADIUS;
s = Math.round(s * 10000) / 10000;
return s;
}
5 设置时区到系统
将获取的timezone id设置到系统属性并广播出去。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top