转自:http://blog.youkuaiyun.com/jhoneson/article/details/47020437
在我之前的一个项目里面,我用到了系统日历,实现的是将一个事件插入到系统日历的日程里面,并且在指定日期进行了提醒。
首先,要了解一下CalendarProvider,这个知识点大家可以上网百度得到,我就不多说了,我在项目里面用到了CalendarContract.Events这个表格。这个表保存了特定的事件信息。在这个表中每一行都有单一事件的信息,如事件的标题、位置、开始时间、结束时间等。这个事件能够发生一次或重复发生多次。会议、提醒和扩展的属性被保存的独立的表中,它们都有一个EVENT_ID跟Events表中的_ID进行关联。具体的表格内容如下:
常量 | 描述 |
CALENDAR_ID | 事件所属的日历的_ID |
ORGANIZER | 事件的组织者(所有者)的电子邮件 |
TITLE | 事件的标题 |
EVENT_LOCATION | 事件发生的地点 |
DESCRIPTION | 事件的描述 |
DTSTART | 事件的启动时间,使用从纪元开始的UTC毫秒计时 |
DTEND | 事件的结束时间,使用从纪元开始的UTC毫秒计时 |
EVENT_TIMEZONE | 事件所针对的时区 |
EVENT_END_TIMEZONE | 针对事件结束时间的时区 |
DURATION | 用RFC5545格式表示的事件持续时间,例如“PT1H”表示事件持续1小时的状态,“P2W”指明2周的持续时间。 |
ALL_DAY | 1指明这个事件会占用整天时间(由本地时区定义的时间);0指明它是一个普通的事件,可以在一天的任何时间开始和结束 |
RRULE | 格式化的事件复发规则(RFC5545)。如“FREQ=WEEKLY;COUNT=10;WKST=SU”。 |
RDATE | 事件的复发日期。通常RDATE要联合RRULE一起使用来定义一个重复发生的事件的合集。 |
AVAILABILITY | If this event counts as busy time or is free time that can be scheduled over. |
GUESTS_CAN_MODIFY | 参与者是否能够修改事件 |
GUESTS_CAN_INVITE_OTHERS | 参与者是否能够邀请其他参与者 |
GUESTS_CAN_SEE_GUESTS | 参与者是否能够看到与会者列表 |
为了实现在项目中调用系统日历和插入日程,我们首先在AndroidManifest.xml文件中添加相关权限,如下:
- <uses-permission android:name="android.permission.READ_CALENDAR" />
- <uses-permission android:name="android.permission.WRITE_CALENDAR" />
然后在要插入日程的地方的代码如下:
-
- String calanderRemiderURL = "";
- if (Build.VERSION.SDK_INT >= 8) {
- calanderRemiderURL = "content://com.<a href="http://lib.youkuaiyun.com/base/15" class='replace_word' title="Android知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Android</a>.calendar/reminders";
- } else {
- calanderRemiderURL = "content://calendar/reminders";
- }
-
- long calID = 3;
- long startMillis = 0;
- long endMillis = 0;
- Calendar beginTime = Calendar.getInstance();
- beginTime.set(2015, 6, 23, 7, 30);
- startMillis = beginTime.getTimeInMillis();
- Calendar endTime = Calendar.getInstance();
- endTime.set(2015, 6, 23, 10, 30);
- endMillis = endTime.getTimeInMillis();
-
- ContentValues eValues = new ContentValues();
- ContentValues rValues = new ContentValues();
- TimeZone tz = TimeZone.getDefault();
-
-
- eValues.put(Events.DTSTART, startMillis);
- eValues.put(Events.DTEND, endMillis);
- eValues.put(Events.TITLE, "见导师");
- eValues.put(Events.DESCRIPTION, "去实验室见研究生导师");
- eValues.put(Events.CALENDAR_ID, calID);
- eValues.put(Events.EVENT_LOCATION, "计算机学院");
- eValues.put(Events.EVENT_TIMEZONE, tz.getID());
- Uri uri = getContentResolver().insert(CalendarContract.Events.CONTENT_URI, eValues);
-
-
- String myEventsId = uri.getLastPathSegment();
- rValues.put("event_id", myEventsId);
- rValues.put("minutes", 10);
- rValues.put("method", 1);
- getContentResolver().insert(Uri.parse(calanderRemiderURL),rValues);
如果想要删除一个日程,则插入如下代码:
-
- int rows = getContentResolver().delete(Events.CONTENT_URI, Events.DESCRIPTION+"=?", new String[]{"去实验室见研究生导师"});
其中,delete函数的第二个参数可以是Events表中任意一个常量,第三个参数则是该常量对应的值,注意,要作为
删除数据的标记,必须是在插入日程的时候用到该参数。