赞
踩
时区更改主要就是拿到时区,设置时区这两大功能
主要是 ZoneGetter 这个类:
/frameworks/base/packages/SettingsLib/src/com/android/settingslib/datetime/ZoneGetter.java
位置:/frameworks/base/packages/SettingsLib
但这个类在Android的SDK中是没有引用的,所以要自己导入jar包引入,settingslib 文件夹下使用mm命令编译,但会报测试类的错,原因测试类需要其他的依赖没有导入
解决办法:不需要测试类直接注释掉其Android.mk文件
它对应的编译后jar位置是
导入这个jar包后虽然编译不会报错了,但运行时还会报错,原因是在 ZoneGetter.java 有依赖R
R正是为了获取时区列表
frameworks/base/packages/SettingsLib/res/xml/timezones.xml
而jar中是不包含资源文件R的,所以运行时会报找不到资源文件的错误。
怎么导入这些资源文件没有研究了,至少Android studio 中没有报错,看着不难受了,编译的时候在Android.dp中加入SettingsLib的引用即可
include frameworks/base/packages/SettingsLib/common.mk
在系统的设置中时区相关的界面是:
TvSettings\Settings\src\com\android\tv\settings\system\TimeZoneFragment.java
很简单就获取到了时区的列表,ZoneGetter.getZonesList(getActivity());
final AlarmManager alarm = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
alarm.setTimeZone(preference.getKey());
设置也非常的简单,都已经封装好了,在应用层调用 AlarmManager 类中的 setTimeZone(zoneId);即可完成时区设置
首先要在AndroidManifest.xml中加入时区相关的权限
<uses-permission android:name="android.permission.SET_TIME_ZONE"
tools:ignore="ProtectedPermissions"/>
public class TimeZoneActivity extends Activity{ private final static String TAG = "TimeZoneFragment"; private List<Map<String, Object>> zoneList; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 获得系统所有时区信息 zoneList = ZoneGetter.getZonesList(this); // 获得当前时区的id String currentTimeZone = ZoneId.systemDefault().getId(); for (final Map<String, Object> zone : zoneList) { String id = (String) zone.get(ZoneGetter.KEY_ID); String displayName = (String) zone.get(ZoneGetter.KEY_DISPLAYNAME); String GMT = (String) zone.get(ZoneGetter.KEY_GMT); int offset = (Integer) zone.get(ZoneGetter.KEY_OFFSET); Log.d("zwt","id::"+id); Log.d("zwt","displayName::"+displayName); Log.d("zwt","GMT::"+GMT); Log.d("zwt","offset::"+offset); Log.d("zwt","======================"); } Log.d("zwt","size::"+zoneList.size()); } private void setTimeZone(String timeZoneId){ AlarmManager alarmManager = mContext.getSystemService(AlarmManager.class); alarmManager.setTimeZone(timeZoneId); if (timezoneAdapter!=null) timezoneAdapter.setCurrentTimezone(timeZoneId); } }
设置时区方法传入的是时区的id,就是for循环中的 String id = (String) zone.get(ZoneGetter.KEY_ID);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。