调用Android自带日历功能(日历列表单、添加一个日历事件)

简介: 调用Android自带日历功能  觉得这篇文章不错,转载过来。 转载:http://blog.csdn.net/djy1992/article/details/9948393 Android手机配备有一个内置的日历应用程序。
觉得这篇文章不错,转载过来。

Android手机配备有一个内置的日历应用程序。第三方应用程序可以利用日历内容提供商接口读取用户的日历信息和安排在日历新的事件。这个日历可以直接同步用户的谷歌日历。 

不幸的是,没有文档和Android手机的日历应用集成,因为有另外一个联系人应用程序。相反,本文所提供的所有信息,将会通过逆向工程的谷歌日历内容提供商。该接口是受变化的,将会支持有限的功能。然而,日历一体化可以成为一些类型的应用强大的功能。 

本文的代码测试之到Android 2.0 SDK版本。我们将发布一个更新如果有一个很大的转变。我们没有测试这个装置,如早先的T - Mobile G1的(SDK的1.6)代码。 

访问日历数据 
为了支持添加到您的日历的Android应用程序,您必须给你的应用程序添加以下权限AndroidManifest.xml文件: 
Java代码   收藏代码
  1. <uses-permission  
  2.   android:name="android.permission.READ_CALENDAR">  
  3.   </uses-permission>  
  4. <uses-permission  
  5.    android:name="android.permission.WRITE_CALENDAR">  
  6.    </uses-permission>  


注册这些权限允许您访问谷歌登录用户的日历数据,无需处理任何问题。该日历应用程序未安装在Android模拟器,因此所有的测试和开发必须在日历应用程序实际完成安装的设备(使用模拟器将无法启动相应的提供者)。日历应用程序和内容提供商可在与谷歌服务,例如T - Mobile G1。 
检索用户日历列表 
用户可能在日历应用程序配置有很多名称的日历。例如,用户可能有一个工作日历(工作日历有关的活动),家庭日历(个人的)和假日日历(法定假日)。 
由用户配置的日历使用并访问内容提供商接口。为了检索用户的日历列表,我们需要为适当Uri以及日历内容提供商设计查询,如下所示: 
Java代码   收藏代码
  1. String[] projection = new String[] { "_id""name" };   
  2.         Uri calendars = Uri.parse("content://calendar/calendars");   
  3.         Cursor managedCursor =   
  4.         managedQuery(calendars, projection, nullnullnull);   


现在,这个查询将返回所有日历,包括那些平时不会用到的。为了得到一个活跃的日历列表单,我们需要在“选择”设置为true的领域在内限制我们的查询 
Java代码   收藏代码
  1. String[] projection = new String[] { "_id""name" };   
  2.         Uri calendars = Uri.parse("content://calendar/calendars");   
  3.         Cursor managedCursor =   
  4.         managedQuery(calendars, projection, "selected=1"nullnull);   

我们现在检索的日历列表。我们可以遍历的结果如下: 
Java代码   收藏代码
  1. if (managedCursor.moveToFirst()) {   
  2.             String calName;   
  3.             String calId;   
  4.             int nameColumn = managedCursor.getColumnIndex("name");   
  5.             int idColumn = managedCursor.getColumnIndex("_id");   
  6.             do {   
  7.             calName = managedCursor.getString(nameColumn);   
  8.             calId = managedCursor.getString(idColumn);   
  9.             } while (managedCursor.moveToNext());   
  10.         }   


一旦我们知道我们想要访问的日历,我们可以添加一个日历事件。日历事件有一些重要领域,其中包括如活动名称,时间和地点以及设置的信息,哪一项将被显示在日历。日历事件可能是一次性或经常性的。 

给日历增加单一事件发生的情况 

添加一个条目到特定的日历,我们需要配置一个日历项插入使用与ContentValues如下: 
Java代码   收藏代码
  1. ContentValues event = new ContentValues();   


每个活动必须与特定日历结合,所以,首先你会想到的是为此事件插入日历标识符。 
Java代码   收藏代码
  1. event.put("calendar_id", calId);   

然后,我们设置了有关事件,其中包括活动的标题,描述和位置弦乐领域的一些基本信息。 
Java代码   收藏代码
  1. event.put("title""Event Title");   
  2.        event.put("description""Event Desc");    
  3.        event.put("eventLocation""Event Location");   

有许多不同的配置选项来设置事件的时间和日期。 

我们可以设置事件的开始和结束的信息如下: 
Java代码   收藏代码
  1. long startTime = START_TIME_MS;   
  2.         long endTime = END_TIME_MS;   
  3.         event.put("dtstart", startTime);   
  4.         event.put("dtend", endTime);   


如果我们增加了生日或假日,我们会设置一个全天事件的条目: 
Java代码   收藏代码
  1. event.put("allDay"1); // 0 for false, 1 for true   

这一信息对于大多数项足够了。但是,有一些其他有用的日历项属性。 

例如,您可以设置事件状态暂定(0),确认(1)或取消(2): 
Java代码   收藏代码
  1. event.put("eventStatus"1);   

您可以控制可以看到它的可见性设置为默认值(0此事件),保密(1),私营(2),或公共(3): 
Java代码   收藏代码
  1. event.put("visibility"0);   

您可以控制日历上事件是否消耗时间,通过设置其透明度,不透明(0)或透明(1)。 
Java代码   收藏代码
  1. event.put("transparency"0);   

您可以控制是否事件触发报警,提醒如下: 
Java代码   收藏代码
  1. event.put("hasAlarm"1); // 0 for false, 1 for true  

一旦日历事件配置正确,我们已经准备好使用ContentResolver插入到相应的开放新日历的日历事件项: 
Java代码   收藏代码
  1. Uri eventsUri = Uri.parse("content://calendar/events");   
  2.        Uri url = getContentResolver().insert(eventsUri, event);   

该调用insert()方法接触的日历内容提供商,并试图插入到相应的用户的日历项。如果您导航到日历应用程序和启动它,你应该看到您在适当的日历中的日历项。自日历同步,你也看到日历项在线,如果你在网络上使用的谷歌日历。 

添加一个定期事件的日历 

您也可以设定定期日历事件。为了做到这一点,你必须根据当前的规则添加更多的字段。规则是根据RFC2445。 

结论 :
Android应用程序可以集成与用户的日历密切的许多Android设备。该日历功能是通过一条内容提供商的接口,允许第三方应用程序访问日历信息,并添加新日历项。 

遇到的问题:
----------------------------------------------------------------
在Android下面用代码插入一个事件和参与人之后,我再在Android上手动修改参与人之类的信息,它就报错了
好像是取不到参与人的URL了,取出来是个-1
Java代码   收藏代码
  1. 03-24 10:12:16.707: ERROR/AndroidRuntime(3254): Caused by: java.lang.IllegalArgumentException: Unknown URL content://calendar/attendees/-1  
  2.   
  3.   
  4.   
  5. 03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at com.android.providers.calendar.CalendarProvider.updateInternal(CalendarProvider.java:3206)  
  6. 03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at android.content.AbstractSyncableContentProvider.update(AbstractSyncableContentProvider.java:283)  
  7. 03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at android.content.ContentProvider$Transport.update(ContentProvider.java:180)  
  8. 03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at android.content.ContentResolver.update(ContentResolver.java:737)  
  9. 03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at com.android.calendar.EventInfoActivity.updateResponse(EventInfoActivity.java:701)  
  10. 03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at com.android.calendar.EventInfoActivity.saveResponse(EventInfoActivity.java:667)  
  11. 03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at com.android.calendar.EventInfoActivity.onPause(EventInfoActivity.java:551)  
  12. 03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at android.app.Activity.performPause(Activity.java:3782)  
  13. 03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1190)  
  14. 03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3149)  
  15. 03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     ... 12 more  
---------------------------------------------------------------

---------------------------------------------------------------


看了下EventInfoActivity的源码解决了
Java代码   收藏代码
  1. if (mCalendarOwnerAttendeeId == -1 && mCalendarOwnerAccount.equals(email)) {  
  2.     mCalendarOwnerAttendeeId = mAttendeesCursor.getInt(ATTENDEES_INDEX_ID);  
  3.     mOriginalAttendeeResponse = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS);  
  4. }  

mCalendarOwnerAttendeeId默认给的值为-1,这里的代码判断了如果参与人的邮件和日历拥有者的邮件不一样,就应该把参与人当被邀请者 
我为了简单就直接把参与者邮件改成和日历拥有者一样的,把他当成ORGANIZER就正常了。

相关文章
|
24天前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
|
3月前
|
Android开发
Android开发表情emoji功能开发
本文介绍了一种在Android应用中实现emoji表情功能的方法,通过将图片与表情字符对应,实现在`TextView`中的正常显示。示例代码展示了如何使用自定义适配器加载emoji表情,并在编辑框中输入或删除表情。项目包含完整的源码结构,可作为开发参考。视频演示和源码详情见文章内链接。
90 4
Android开发表情emoji功能开发
|
3月前
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
73 3
|
3月前
|
Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
3月前
|
Android开发
Android面试高频知识点(1) 图解 Android 事件分发机制
Android面试高频知识点(1) 图解 Android 事件分发机制
56 1
|
3月前
|
XML 前端开发 Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
3月前
|
Android开发
Android 事件分发机制详细解读
Android 事件分发机制详细解读
48 5
|
5月前
|
编解码 测试技术 Android开发
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
本文详细介绍了如何利用CameraX库实现高质量的照片及视频拍摄功能,包括添加依赖、初始化、权限请求、配置预览与捕获等关键步骤。此外,还特别针对不同分辨率和帧率的视频拍摄提供了性能优化策略,确保应用既高效又稳定。
561 1
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
|
4月前
|
Android开发 开发者
Android平台无纸化同屏如何实现实时录像功能
Android平台无纸化同屏,如果需要本地录像的话,实现难度不大,只要复用之前开发的录像模块的就可以,对我们来说,同屏采集这块,只是数据源不同而已,如果是自采集的其他数据,我们一样可以编码录像。
|
5月前
|
图形学 Android开发
小功能⭐️Unity调用Android常用事件
小功能⭐️Unity调用Android常用事件

热门文章

最新文章