Android调用系统日历插入日程

本文介绍了如何在Android应用中使用系统日历API创建和删除日程,详细展示了通过ContentProvider操作CalendarContract.Events表的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自: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_DAY1指明这个事件会占用整天时间(由本地时区定义的时间);0指明它是一个普通的事件,可以在一天的任何时间开始和结束
RRULE格式化的事件复发规则(RFC5545)。如“FREQ=WEEKLY;COUNT=10;WKST=SU”。
RDATE事件的复发日期。通常RDATE要联合RRULE一起使用来定义一个重复发生的事件的合集。
AVAILABILITYIf 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文件中添加相关权限,如下:

[html]  view plain  copy
  1. <uses-permission android:name="android.permission.READ_CALENDAR" />  
  2. <uses-permission android:name="android.permission.WRITE_CALENDAR" />  

然后在要插入日程的地方的代码如下:

  1. //先定义一个URL,到时作为调用系统日历的uri的参数  
  2. String calanderRemiderURL = "";  
  3. if (Build.VERSION.SDK_INT >= 8) {  
  4.     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";  
  5. else {  
  6.     calanderRemiderURL = "content://calendar/reminders";  
  7. }  
  8.           
  9. long calID = 3;  
  10. long startMillis = 0;   
  11. long endMillis = 0;       
  12. Calendar beginTime = Calendar.getInstance();  
  13. beginTime.set(2015623730);  //注意,月份的下标是从0开始的  
  14. startMillis = beginTime.getTimeInMillis();  //插入日历时要取毫秒计时  
  15. Calendar endTime = Calendar.getInstance();  
  16. endTime.set(20156231030);  
  17. endMillis = endTime.getTimeInMillis();  
  18.           
  19. ContentValues eValues = new ContentValues();  //插入事件  
  20. ContentValues rValues = new ContentValues();  //插入提醒,与事件配合起来才有效  
  21. TimeZone tz = TimeZone.getDefault();//获取默认时区  
  22.           
  23. //插入日程  
  24. eValues.put(Events.DTSTART, startMillis);  
  25. eValues.put(Events.DTEND, endMillis);  
  26. eValues.put(Events.TITLE, "见导师");  
  27. eValues.put(Events.DESCRIPTION, "去实验室见研究生导师");  
  28. eValues.put(Events.CALENDAR_ID, calID);  
  29. eValues.put(Events.EVENT_LOCATION, "计算机学院");  
  30. eValues.put(Events.EVENT_TIMEZONE, tz.getID());   
  31. Uri uri = getContentResolver().insert(CalendarContract.Events.CONTENT_URI, eValues);  
  32.               
  33. //插完日程之后必须再插入以下代码段才能实现提醒功能    
  34. String myEventsId = uri.getLastPathSegment(); // 得到当前表的_id  
  35. rValues.put("event_id", myEventsId);  
  36. rValues.put("minutes"10); //提前10分钟提醒  
  37. rValues.put("method"1);   //如果需要有提醒,必须要有这一行  
  38. getContentResolver().insert(Uri.parse(calanderRemiderURL),rValues);  

如果想要删除一个日程,则插入如下代码:

  1. //用rows保存删除的行数,以备有用  
  2. int rows = getContentResolver().delete(Events.CONTENT_URI, Events.DESCRIPTION+"=?"new String[]{"去实验室见研究生导师"});  

其中,delete函数的第二个参数可以是Events表中任意一个常量,第三个参数则是该常量对应的值,注意,要作为

删除数据的标记,必须是在插入日程的时候用到该参数。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值