android日历相关总结
最近做了一个日历相关的需求对日历算是有了比较好的了解,开发日历过程中网上资料比较零散所以打算总结一下和大家分享一下欢迎大家交流。
先明确两个问题
1、Android日历事件必须挂在到某个日历分类上 。
2、Android日历分类可分为本地和非本地,若非本地日历同步的时候日历事件可能会消失。
一个用户可以拥有多个 Calendar,每个 Calendar 可以与不同类型的帐号关联(Google Calendar、Exchange 等)。
CalendarContract 定义了 Calendar 和 Event 的数据模型。这些数据存放在以下数据表中。
我们下面简单的介绍一下使用calendars,events,reninders三张张表来实现事件的新增
calendars表结构
events表结构
reminders表结构
以上是 日历的基础知识
主要明确 先新建日历分类 然后 在在日历分类新建日历事件具体的日历和日历事件有关基本知识阅读上面四个表
下面简单介绍实操
1、权限
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
2、申请权限
3、创建日历分类
// 开始组装账户数据
ContentValues account = new ContentValues();
// 账户类型:本地
// 在添加账户时,如果账户类型不存在系统中,则可能该新增记录会被标记为脏数据而被删除
// 设置为ACCOUNT_TYPE_LOCAL可以保证在不存在账户类型时,该新增数据不会被删除
account.put(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);
// 日历在表中的名称
account.put(CalendarContract.Calendars.NAME, CALENDAR_NAME);
// 日历账户的名称
account.put(CalendarContract.Calendars.ACCOUNT_NAME, CALENDAR_ACCOUNT_NAME);
// 账户显示的名称
account.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, CALENDAR_DISPLAY_NAME);
// 日历的颜色
account.put(CalendarContract.Calendars.CALENDAR_COLOR, Color.parseColor("#515bd4"));
// 用户对此日历的获取使用权限等级
account.put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_OWNER);
// 设置此日历可见
account.put(CalendarContract.Calendars.VISIBLE, 1);
// 日历时区
account.put(CalendarContract.Calendars.CALENDAR_TIME_ZONE, TimeZone.getDefault().getID());
// 可以修改日历时区
account.put(CalendarContract.Calendars.CAN_MODIFY_TIME_ZONE, 1);
// 同步此日历到设备上
account.put(CalendarContract.Calendars.SYNC_EVENTS, 1);
// 拥有者的账户
account.put(CalendarContract.Calendars.OWNER_ACCOUNT, CALENDAR_ACCOUNT_NAME);
// 可以响应事件
account.put(CalendarContract.Calendars.CAN_ORGANIZER_RESPOND, 1);
// 单个事件设置的最大的提醒数
account.put(CalendarContract.Calendars.MAX_REMINDERS, 8);
// 设置允许提醒的方式
account.put(CalendarContract.Calendars.ALLOWED_REMINDERS, "0,1,2,3,4");
// 设置日历支持的可用性类型
account.put(CalendarContract.Calendars.ALLOWED_AVAILABILITY, "0,1,2");
// 设置日历允许的出席者类型
account.put(CalendarContract.Calendars.ALLOWED_ATTENDEE_TYPES, "0,1,2");
4、创建日历事件
event.put(CalendarContract.Events.CALENDAR_ID, calendarId);
// 事件开始时间
event.put(CalendarContract.Events.DTSTART, calendarEvent.getStart());
// 事件结束时间
event.put(CalendarContract.Events.DTEND, calendarEvent.getEnd());
// 事件标题
event.put(CalendarContract.Events.TITLE, calendarEvent.getTitle());
// 事件描述(对应手机系统日历备注栏)
event.put(CalendarContract.Events.DESCRIPTION, calendarEvent.getDescription());
// 事件地点
event.put(CalendarContract.Events.EVENT_LOCATION, calendarEvent.getEventLocation());
// 事件时区
event.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());
// 定义事件的显示,默认即可
event.put(CalendarContract.Events.ACCESS_LEVEL, CalendarContract.Events.ACCESS_DEFAULT);
// 事件的状态
event.put(CalendarContract.Events.STATUS, 1);
// 设置事件提醒警报可用
event.put(CalendarContract.Events.HAS_ALARM, true);
// 设置事件忙
event.put(CalendarContract.Events.AVAILABILITY, CalendarContract.Events.AVAILABILITY_BUSY);
String dailay = "FREQ=DAILY;UNTIL="+Util.getFinalRRuleMode(calendarEvent.getEnd());
// 设置事件重复规则
event.put(CalendarContract.Events.RRULE, dailay);
4、给事件设置提醒
ContentValues reminders = new ContentValues();
// 此提醒所对应的事件ID
reminders.put(CalendarContract.Reminders.EVENT_ID, eventID);
// 设置提醒提前的时间(0:准时 -1:使用系统默认)
reminders.put(CalendarContract.Reminders.MINUTES, calendarEvent.getAdvanceTime());
// 设置事件提醒方式为通知警报
reminders.put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT);
reminderUri = context.getContentResolver().insert(uri, reminders);