Android 时区更改笔记

时区更改主要就是拿到时区,设置时区这两大功能
主要是 ZoneGetter 这个类:

/frameworks/base/packages/SettingsLib/src/com/android/settingslib/datetime/ZoneGetter.java
位置:/frameworks/base/packages/SettingsLib

但这个类在Android的SDK中是没有引用的,所以要自己导入jar包引入,settingslib 文件夹下使用mm命令编译,但会报测试类的错,原因测试类需要其他的依赖没有导入
在这里插入图片描述
解决办法:不需要测试类直接注释掉其Android.mk文件
Android 时区更改笔记_第1张图片
它对应的编译后jar位置是
在这里插入图片描述
导入这个jar包后虽然编译不会报错了,但运行时还会报错,原因是在 ZoneGetter.java 有依赖R
Android 时区更改笔记_第2张图片
R正是为了获取时区列表

frameworks/base/packages/SettingsLib/res/xml/timezones.xml

而jar中是不包含资源文件R的,所以运行时会报找不到资源文件的错误。
Android 时区更改笔记_第3张图片
怎么导入这些资源文件没有研究了,至少Android studio 中没有报错,看着不难受了,编译的时候在Android.dp中加入SettingsLib的引用即可

include frameworks/base/packages/SettingsLib/common.mk
Android 时区更改笔记_第4张图片

获得时区信息

在系统的设置中时区相关的界面是:

TvSettings\Settings\src\com\android\tv\settings\system\TimeZoneFragment.java
Android 时区更改笔记_第5张图片
很简单就获取到了时区的列表,ZoneGetter.getZonesList(getActivity());

设置时区

final AlarmManager alarm = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
alarm.setTimeZone(preference.getKey());
Android 时区更改笔记_第6张图片
设置也非常的简单,都已经封装好了,在应用层调用 AlarmManager 类中的 setTimeZone(zoneId);即可完成时区设置

时区设置

首先要在AndroidManifest.xml中加入时区相关的权限

"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);

你可能感兴趣的:(android,android,android,studio,ide)