`
407827531
  • 浏览: 1060216 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

调用Android自带日历功能

阅读更多

推荐安卓开发神器(里面有各种UI特效和android代码库实例)

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

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

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

访问日历数据
为了支持添加到您的日历的Android应用程序,您必须给你的应用程序添加以下权限AndroidManifest.xml文件:

<uses-permission
  android:name="android.permission.READ_CALENDAR">
  </uses-permission>
<uses-permission
   android:name="android.permission.WRITE_CALENDAR">
   </uses-permission>



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

String[] projection = new String[] { "_id", "name" }; 
        Uri calendars = Uri.parse("content://calendar/calendars"); 
        Cursor managedCursor = 
        managedQuery(calendars, projection, null, null, null); 



现在,这个查询将返回所有日历,包括那些平时不会用到的。为了得到一个活跃的日历列表单,我们需要在“选择”设置为true的领域在内限制我们的查询

String[] projection = new String[] { "_id", "name" }; 
        Uri calendars = Uri.parse("content://calendar/calendars"); 
        Cursor managedCursor = 
        managedQuery(calendars, projection, "selected=1", null, null); 


我们现在检索的日历列表。我们可以遍历的结果如下:

if (managedCursor.moveToFirst()) { 
        	String calName; 
        	String calId; 
        	int nameColumn = managedCursor.getColumnIndex("name"); 
        	int idColumn = managedCursor.getColumnIndex("_id"); 
        	do { 
        	calName = managedCursor.getString(nameColumn); 
        	calId = managedCursor.getString(idColumn); 
        	} while (managedCursor.moveToNext()); 
        } 



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

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

添加一个条目到特定的日历,我们需要配置一个日历项插入使用与ContentValues如下:

ContentValues event = new ContentValues(); 



每个活动必须与特定日历结合,所以,首先你会想到的是为此事件插入日历标识符。

event.put("calendar_id", calId); 


然后,我们设置了有关事件,其中包括活动的标题,描述和位置弦乐领域的一些基本信息。

 event.put("title", "Event Title"); 
        event.put("description", "Event Desc");  
        event.put("eventLocation", "Event Location"); 


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

我们可以设置事件的开始和结束的信息如下:

long startTime = START_TIME_MS; 
        long endTime = END_TIME_MS; 
        event.put("dtstart", startTime); 
        event.put("dtend", endTime); 



如果我们增加了生日或假日,我们会设置一个全天事件的条目:

event.put("allDay", 1); // 0 for false, 1 for true 


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

例如,您可以设置事件状态暂定(0),确认(1)或取消(2):

event.put("eventStatus", 1); 


您可以控制可以看到它的可见性设置为默认值(0此事件),保密(1),私营(2),或公共(3):

event.put("visibility", 0); 


您可以控制日历上事件是否消耗时间,通过设置其透明度,不透明(0)或透明(1)。

event.put("transparency", 0); 


您可以控制是否事件触发报警,提醒如下:

event.put("hasAlarm", 1); // 0 for false, 1 for true


一旦日历事件配置正确,我们已经准备好使用ContentResolver插入到相应的开放新日历的日历事件项:

 Uri eventsUri = Uri.parse("content://calendar/events"); 
        Uri url = getContentResolver().insert(eventsUri, event); 


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

添加一个定期事件的日历

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

结论

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

 

分享到:
评论
2 楼 lucane 2011-03-24  
看了下EventInfoActivity的源码解决了
                    if (mCalendarOwnerAttendeeId == -1 && mCalendarOwnerAccount.equals(email)) {
                        mCalendarOwnerAttendeeId = mAttendeesCursor.getInt(ATTENDEES_INDEX_ID);
                        mOriginalAttendeeResponse = mAttendeesCursor.getInt(ATTENDEES_INDEX_STATUS);
                    }

mCalendarOwnerAttendeeId默认给的值为-1,这里的代码判断了如果参与人的邮件和日历拥有者的邮件不一样,就应该把参与人当被邀请者

我为了简单就直接把参与者邮件改成和日历拥有者一样的,把他当成ORGANIZER就正常了
1 楼 lucane 2011-03-24  
我在Android下面用代码插入一个事件和参与人之后,我再在Android上手动修改参与人之类的信息,它就报错了

好像是取不到参与人的URL了,取出来是个-1
03-24 10:12:16.707: ERROR/AndroidRuntime(3254): Caused by: java.lang.IllegalArgumentException: Unknown URL content://calendar/attendees/-1



03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at com.android.providers.calendar.CalendarProvider.updateInternal(CalendarProvider.java:3206)
03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at android.content.AbstractSyncableContentProvider.update(AbstractSyncableContentProvider.java:283)
03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at android.content.ContentProvider$Transport.update(ContentProvider.java:180)
03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at android.content.ContentResolver.update(ContentResolver.java:737)
03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at com.android.calendar.EventInfoActivity.updateResponse(EventInfoActivity.java:701)
03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at com.android.calendar.EventInfoActivity.saveResponse(EventInfoActivity.java:667)
03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at com.android.calendar.EventInfoActivity.onPause(EventInfoActivity.java:551)
03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at android.app.Activity.performPause(Activity.java:3782)
03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1190)
03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3149)
03-24 10:12:16.707: ERROR/AndroidRuntime(3254):     ... 12 more


LZ有这方面的经验吗,谢谢

相关推荐

    android调用系统日历(google calendar)

    调用系统自带的日历,适用于android 2.1-4.0

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Android 一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导开发 IOS 由苹果公司开发的移动操作系统 Webkit 一个开源的浏览器引擎,在手机上的...

    java开源包1

    1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...

    JAVA上百实例源码以及开源项目

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

    JAVA上百实例源码以及开源项目源代码

    Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,日期选择 Java语言开发的简洁实用的日期选择控件,源码文件功能说明: [DateChooser.java] Java 日期选择控件(主体类) [public] ...

    java开源包11

    1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...

    java开源包2

    1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...

    java开源包3

    1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...

    java开源包6

    1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...

    java开源包5

    1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...

    java开源包10

    1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...

    java开源包4

    1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...

    java开源包8

    1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...

    java开源包7

    1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...

    java开源包9

    1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...

    java开源包101

    1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...

    Java资源包01

    1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/...

Global site tag (gtag.js) - Google Analytics