日历提供者
CalendarContract.Calendars
CalendarContract.Events
CalendarContract.Attendees
CalendarContract.Reminders
日历提供者是用户的日历事件的存储库。日历提供API允许你进行查询,插入,更新和日历,活动参加者,提醒删除操作,等等。
该日历提供API可以通过应用程序和同步适配器配合使用。这些规则取决于什么类型的节目正在调用。本文主要关注使用日历提供程序API为应用程序。对于同步适配器如何不同的讨论,参见同步适配器。
通常情况下,要读取或写入日历数据,应用程序的清单必须包括适当的权限,在用户权限描述。为了使执行常见的操作更容易,日历提供商提供了一组意图,如在日历意图描述。这些意图将用户带到日历应用程序中插入,查看和编辑事件。用户与日历应用程序进行交互,然后返回到原来的程序。因此,你的应用程序并不需要请求的权限,也不需要提供一个用户界面来查看或创建活动。
基础知识
内容提供商存储数据,并使其应用程序访问。通过Android平台(包括日历提供商)提供的内容提供商通常公开数据作为一组基于关系数据库模型,其中每行是一个记录表和每一列是一种特殊类型和意义的数据。通过日历提供程序API,应用程序和同步适配器可以读给持有用户的日历数据的数据库表/写访问。
每个内容提供商公开了一个公共的URI(包装成Uri对象)的唯一标识它的数据集。控制多个数据集(多个表),内容提供者暴露一个独立的URI的每一个。对于供应商所有的URI开始字符串“内容://”。这个标识数据作为由内容提供商所控制。日历提供者定义了URI的为每个类(表)的常数。这些URI的格式为<类> .CONTENT_URI。例如,Events.CONTENT_URI。
图1显示了日历Provider数据模型的图形表示。它显示了主表和其链接到彼此的字段。
日历提供数据模型
图1.日历提供的数据模型。
用户可以有多个日历,以及不同的日历可以与不同类型的账户(谷歌日历,交易所等)相关联。
所述CalendarContract定义日历和事件相关的信息的数据模型。此数据存储在多个表中,列出如下。
表(类)说明
CalendarContract.Calendars
该表保存特定的日历信息。此表中的每行包含一个单一的日历的细节,如名称,颜色,同步信息等。
CalendarContract.Events该表保存特定事件的信息。此表中的每一行具有用于单个事件,例如,事件标题,位置,开始时间,结束时间,等等的信息。该事件可以发生一次性或可循环多次。与会者,提醒和扩展属性存储在单独的表。他们每个人都有引用_ID事件表的EVENT_ID。
CalendarContract.Instances该表保存的开始和结束时间的事件的每次发生。在这个表中的每一行代表一个单一的事件发生。对于一次性事件有一个1:实例事件的映射。对于周期性事件,多行自动生成对应于该事件的多个实例。
CalendarContract.Attendees该表保存事件参与者(客户)的信息。每一行代表一个事件的一个客人。它指定客人的类型和事件的来宾的出席回应。
CalendarContract.Reminders该表保存警报/通知数据。每一行代表一个事件一个警报。一个事件可以有多个提醒。每个事件提醒的最大数量在MAX_REMINDERS,这是由拥有给定日历同步适配器设置中指定。提醒以分钟指定的事件之前并具有确定用户将如何被警告的方法。
日历提供API的设计是灵活和强大。同时,它提供了良好的最终用户体验,保护日历和其数据的完整性是重要的。为此,这里有一些事情使用API时,要牢记:
插入,更新和查看日历事件。直接插入,修改,并从日历提供商读取事件,则需要相应的权限。但是,如果你没有建立一个全面的日历应用程序或同步适配器,请求这些权限是没有必要的。您可以替代由Android的日历应用程序,手头宽裕的读写操作该应用程序支持的意图。当您使用的意图,你的应用程序发送用户的日历应用程序在一个预先填好的表格执行所需操作。他们完成后,他们返回到您的应用程序。通过设计应用程序通过日历执行常见的操作,您提供一个一致的,可靠的用户界面的用户。这是推荐的方法。欲了解更多信息,请参阅日历意图。
同步适配器。一个同步适配器同步的用户与其他服务器或数据源装置上的日历数据。在CalendarContract.Calendars和CalendarContract.Events表,有保留用于同步适配器中使用的列。提供者和应用程序不应该对其进行修改。事实上,他们是不可见的,除非它们被作为一个同步适配器访问。有关同步适配器的详细信息,请参阅同步适配器。
用户权限
要读取日历数据,应用程序必须在其清单文件中的功能(6)的权限。它必须包括WRITE_CALENDAR权限删除,插入或更新日历数据:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"...>
<uses-sdk android:minSdkVersion="14" />
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
...
</manifest>
日历表
该CalendarContract.Calendars表包含单个日历的详细信息。以下日历列是由双方在应用程序和同步适配器可写的。有关支持字段的完整列表,请参阅CalendarContract.Calendars参考。
常量说明
名称中的日历名称。
CALENDAR_DISPLAY_NAME此日历显示给该用户的名称。
Visible布尔指示日历是否处于选中状态显示。 0值表示与此日历关联的事件应该不会显示。值为1表示与此日历关联的事件应该显示。此值影响在CalendarContract.Instances表中的行的产生。
SYNC_EVENTS一个布尔值,指示是否历应同步并存储在设备上的事件。值为0表示不同步此日历或在设备上存储的事件。值为1表示该日历同步事件,并在设备上存储的事件。
查询日历
下面的例子说明如何获得由某个特定用户所拥有的日历的例子。为简单起见,在这个例子中,查询操作在用户界面线程所示(“主线程”)。在实践中,这应该在异步线程,而不是在主线程进行。有关详细讨论,请参见装载机。如果你不只是数据的读取,修改它,请参阅AsyncQueryHandler。
// Projection array. Creating indices for this array instead of doing
// dynamic lookups improves performance.
public static final String[] EVENT_PROJECTION = new String[] {
Calendars._ID, // 0
Calendars.ACCOUNT_NAME, // 1
Calendars.CALENDAR_DISPLAY_NAME, // 2
Calendars.OWNER_ACCOUNT // 3
};
// The indices for the projection array above.
private static final int PROJECTION_ID_INDEX = 0;
private static final int PROJECTION_ACCOUNT_NAME_INDEX = 1;
private static final int PROJECTION_DISPLAY_NAME_INDEX = 2;
private static final int PROJECTION_OWNER_ACCOUNT_INDEX = 3;
如果您在Calendars.ACCOUNT_NAME查询,还必须包括Calendars.ACCOUNT_TYPE评选。这是因为给定的帐户只视为唯一给其两个ACCOUNT_NAME和ACCOUNT_TYPE。该ACCOUNT_TYPE是对应于时计是用的AccountManager注册时使用的帐户身份验证字符串。还有一个名为ACCOUNT_TYPE_LOCAL不与设备帐户相关联的日历一种特殊类型的帐户。 ACCOUNT_TYPE_LOCAL账户没有得到同步。
在这个例子中的一个部分中,您构建您的查询。该选择指定用于查询的标准。在这个例子中,查询是寻找具有ACCOUNT_NAME“
[email protected]”时,ACCOUNT_TYPE“com.google”,并且OWNER_ACCOUNT“
[email protected]”日历。如果你想看到一个用户查看所有日历,而不仅仅是日历的用户拥有,省略OWNER_ACCOUNT。该查询返回,您可以使用遍历由数据库查询返回的结果集的光标对象。对于内容提供商使用查询的详细讨论,请参阅内容提供商。
// Run query
Cursor cur = null;
ContentResolver cr = getContentResolver();
Uri uri = Calendars.CONTENT_URI;
String selection = "((" + Calendars.ACCOUNT_NAME + " = ?) AND ("
+ Calendars.ACCOUNT_TYPE + " = ?) AND ("
+ Calendars.OWNER_ACCOUNT + " = ?))";
String[] selectionArgs = new String[] {"[email protected]", "com.google",
"[email protected]"};
// Submit the query and get a Cursor object back.
cur = cr.query(uri, EVENT_PROJECTION, selection, selectionArgs, null);
下一节使用游标来浏览结果集。它使用分别设置在实施例的开始到每个字段返回的值的常数。
// Use the cursor to step through the returned records
while (cur.moveToNext()) {
long calID = 0;
String displayName = null;
String accountName = null;
String ownerName = null;
// Get the field values
calID = cur.getLong(PROJECTION_ID_INDEX);
displayName = cur.getString(PROJECTION_DISPLAY_NAME_INDEX);
accountName = cur.getString(PROJECTION_ACCOUNT_NAME_INDEX);
ownerName = cur.getString(PROJECTION_OWNER_ACCOUNT_INDEX);
// Do something with the values...
...
}
修改日历
要执行日历的更新,可以提供日历无论是作为附加标识的URI(withAppendedId()),或作为第一选择项目的_ID。的选择应以启动“_id =?”,并在第一selectionArg应的日历的_ID。您也可以通过编码在URI标识做更新。这个例子改变使用(withAppendedId())的方法日历的显示名称:
private static final String DEBUG_TAG = "MyActivity";
...
long calID = 2;
ContentValues values = new ContentValues();
// The new display name for the calendar
values.put(Calendars.CALENDAR_DISPLAY_NAME, "Trevor's Calendar");
Uri updateUri = ContentUris.withAppendedId(Calendars.CONTENT_URI, calID);
int rows = getContentResolver().update(updateUri, values, null, null);
Log.i(DEBUG_TAG, "Rows updated: " + rows);
插入日历
日历被设计成一个同步适配器主要是管理,所以你应该只插入新日历作为同步适配器。在大多数情况下,应用程序只能做出粗浅更改日历,如更改显示名称。如果应用程序需要创建一个本地日历,它可以通过执行日历插入作为一个同步适配器,使用ACCOUNT_TYPE_LOCAL的ACCOUNT_TYPE做到这一点。 ACCOUNT_TYPE_LOCAL是未与设备帐户相关联的日历专户类型。这种类型的日历未同步到服务器。对于同步适配器的讨论,请参见同步适配器。
事件表
该CalendarContract.Events表包含个别事件详情。要添加,更新或删除事件,应用程序必须在其清单文件中WRITE_CALENDAR权限。
以下事件列是由双方在应用程序和同步适配器可写的。有关支持字段的完整列表,请参阅CalendarContract.Events参考。
常量说明
日历CALENDAR_ID的_ID事件属于。
活动的组织者(所有者)组织者电子邮件。
TITLE事件的标题。
EVENT_LOCATION当事件发生。
说明事件的说明。
DTSTART时代以来在UTC毫秒活动的开始时间。
DTEND时代以来在UTC毫秒事件结束的时间。
EVENT_TIMEZONE事件的时区。
EVENT_END_TIMEZONE为事件的结束时间的时区。
在期限格式RFC5545事件的持续时间。例如,“PT1H”的值指出,事件应持续一小时,“P2W”下的值表示2周的持续时间。
ALL_DAY的值为1表示该事件占据了整整一天,由当地时区的定义。 0值表明它是一个可以启动,并在在一天的任何时间终止定期举行的活动。
RRULE事件格式的重复规则。例如,“FREQ = WEEKLY; COUNT = 10; WKST = SU”。你可以在这里找到更多的例子。
RDATE事件复发的日期。您通常结合使用RDATE与RRULE定义聚集组重复出现。有关详细讨论,请参见RFC5545规范。
可用性如果此事件计数为忙碌的时间或者是说可以实现预定的空闲时间。
GUESTS_CAN_MODIFY客人是否可以修改该事件。
GUESTS_CAN_INVITE_OTHERS客人是否可以邀请其他客人。
GUESTS_CAN_SEE_GUESTS无论客人可以看到与会者列表。
添加活动
当你的应用程序插入一个新的事件,我们建议您使用INSERT意图,如使用意图插入事件描述。但是,如果你需要的话,您可以直接插入事件。本节介绍了如何做到这一点。
下面是插入一个新的事件的规则:
您必须包括CALENDAR_ID和DTSTART。
您必须包括EVENT_TIMEZONE。为了让系统的安装时区ID列表,可使用getAvailableIDs()。请注意,如果你插入通过INSERT意图在使用意图插入一个事件在该方案中,默认时区提供描述的事件,此规则不适用。
对于非经常性事件,必须包括DTEND。
对于经常性事件,必须包含除RRULE或RDATE的持续时间。请注意,如果你插入通过插入意图,在使用意图描述一个事件插入一个事件在该方案中,您可以在DTSTART和DTEND一起使用RRULE此规则不适用,以及日历应用程序转换它为自动的持续时间。
这里是插入一个事件的一个例子。这是为简明起见,UI线程正在执行。在实践中,插入和更新应该在异步线程来完成的动作移动到后台线程。欲了解更多信息,请参阅AsyncQueryHandler。
long calID = 3;
long startMillis = 0;
long endMillis = 0;
Calendar beginTime = Calendar.getInstance();
beginTime.set(2012, 9, 14, 7, 30);
startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(2012, 9, 14, 8, 45);
endMillis = endTime.getTimeInMillis();
...
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(Events.DTSTART, startMillis);
values.put(Events.DTEND, endMillis);
values.put(Events.TITLE, "Jazzercise");
values.put(Events.DESCRIPTION, "Group workout");
values.put(Events.CALENDAR_ID, calID);
values.put(Events.EVENT_TIMEZONE, "America/Los_Angeles");
Uri uri = cr.insert(Events.CONTENT_URI, values);
// get the event ID that is the last element in the Uri
long eventID = Long.parseLong(uri.getLastPathSegment());
//
// ... do something with event ID
//
//
注:参见本示例如何捕获事件ID创建活动后。这是为了获得一个事件ID的最简单的方法。你经常需要事件ID执行其他日历操作 - 例如,向与会者或提醒添加到事件。
更新活动
当应用程序希望允许用户编辑的事件,我们建议您使用的编辑意图,如使用的意图,编辑事件描述。但是,如果你需要的话,您可以直接编辑的事件。要执行事件的更新,您可以提供事件无论是作为附加标识的URI(withAppendedId()),或作为第一选择项目的_ID。的选择应以启动“_id =?”,并在第一selectionArg应该事件的_ID。你也可以用做没有ID选择更新。这里是更新的事件的一个例子。它改变使用withAppendedId()方法事件的标题:
private static final String DEBUG_TAG = "MyActivity";
...
long eventID = 188;
...
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
Uri updateUri = null;
// The new title for the event
values.put(Events.TITLE, "Kickboxing");
updateUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
int rows = getContentResolver().update(updateUri, values, null, null);
Log.i(DEBUG_TAG, "Rows updated: " + rows);
删除事件
您可以通过它_ID作为对URI,附加一个ID或使用标准选择删除事件。如果使用附加ID,你不能也做了选择。还有的删除两个版本:作为一个应用程序,并作为一个同步适配器。应用程序中删除集的删除列。本标记,告诉该行已被删除,此删除应当被传播到服务器的同步适配器。一个同步适配器删除与其相关联的所有数据一起从数据库中删除该事件。这里是应用删除通过其_ID的事件的一个例子:
private static final String DEBUG_TAG = "MyActivity";
...
long eventID = 201;
...
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
Uri deleteUri = null;
deleteUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
int rows = getContentResolver().delete(deleteUri, null, null);
Log.i(DEBUG_TAG, "Rows deleted: " + rows);
与会者表
在CalendarContract.Attendees表的每一行代表一个事件的单个与会者或客人。调用查询()返回给定的EVENT_ID活动参加者的名单。此EVENT_ID必须的特定事件的_ID匹配。
下表列出了可写入的字段。当插入一个新的参与者,你必须包括所有的人,除了ATTENDEE_NAME。
常量说明
该事件的EVENT_ID的ID。
ATTENDEE_NAME与会者的名称。
ATTENDEE_EMAIL与会者的电子邮件地址。
ATTENDEE_RELATIONSHIP
与会者事件的关系。其中之一:
RELATIONSHIP_ATTENDEE
RELATIONSHIP_NONE
RELATIONSHIP_ORGANIZER
RELATIONSHIP_PERFORMER
RELATIONSHIP_SPEAKER
ATTENDEE_TYPE
类型与会者的。其中之一:
TYPE_REQUIRED
TYPE_OPTIONAL
ATTENDEE_STATUS
与会者的出勤状况。其中之一:
ATTENDEE_STATUS_ACCEPTED
ATTENDEE_STATUS_DECLINED
ATTENDEE_STATUS_INVITED
ATTENDEE_STATUS_NONE
ATTENDEE_STATUS_TENTATIVE
添加与会者
下面是将单个与会者对事件的例子。注意,EVENT_ID是必需的:
long eventID = 221;
...
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(Reminders.MINUTES, 15);
values.put(Reminders.EVENT_ID, eventID);
values.put(Reminders.METHOD, Reminders.METHOD_ALERT);
Uri uri = cr.insert(Reminders.CONTENT_URI, values);
提醒表
在CalendarContract.Reminders表的每一行代表一个事件一个提醒。调用查询()返回提醒给定的EVENT_ID事件的列表。
下表列出了提醒的可写域。所有的人都必须插入一个新的提醒时被包括在内。请注意,同步适配器指定提醒他们在CalendarContract.Calendars表支持的类型。见ALLOWED_REMINDERS了解详情。
常量说明
该事件的EVENT_ID的ID。
分钟分钟前的提醒应该触发事件。
方法
报警方法,如在服务器上设置。其中之一:
METHOD_ALERT
METHOD_DEFAULT
METHOD_EMAIL
METHOD_SMS
添加提醒
这个例子增加了一个提醒的事件。提醒触发事件发生前15分钟。
长EVENTID = 221;
...
ContentResolver的CR = getContentResolver();
ContentValues值=新ContentValues();
values.put(Reminders.MINUTES,15);
values.put(Reminders.EVENT_ID,事件ID);
values.put(Reminders.METHOD,Reminders.METHOD_ALERT);
URI URI = cr.insert(Reminders.CONTENT_URI,价值观);
实例表
该CalendarContract.Instances表保存的开始和结束时间的事件发生。在这个表中的每一行代表一个单一的事件发生。实例表不可写,只提供了一种方法来查询事件发生。
下表列出了一些你可以为实例查询的字段。请注意,时区由KEY_TIMEZONE_TYPE和KEY_TIMEZONE_INSTANCES定义。
常量说明
开始实例的开始时间,以UTC毫秒。
结束实例的结束时间,在UTC毫秒。
实例END_DAY朱利安结束日期,相对于日历的时区。
END_MINUTE从午夜在日历的时间区间内测量实例的结束分钟。
此实例的事件EVENT_ID的_ID。
START_DAY朱利安启动实例的当天,相对日历的时区。
START_MINUTE午夜测量的实例的开始分钟,相对于日历的时区。
查询实例表
要查询实例表,你需要指定一个时间范围在URI查询。在这个例子中,CalendarContract.Instances通过其执行的CalendarContract.EventsColumns界面的能存取到TITLE字段。换句话说,标题是通过数据库视图返回,而不是通过查询原始CalendarContract.Instances表。
private static final String DEBUG_TAG = "MyActivity";
public static final String[] INSTANCE_PROJECTION = new String[] {
Instances.EVENT_ID, // 0
Instances.BEGIN, // 1
Instances.TITLE // 2
};
// The indices for the projection array above.
private static final int PROJECTION_ID_INDEX = 0;
private static final int PROJECTION_BEGIN_INDEX = 1;
private static final int PROJECTION_TITLE_INDEX = 2;
...
// Specify the date range you want to search for recurring
// event instances
Calendar beginTime = Calendar.getInstance();
beginTime.set(2011, 9, 23, 8, 0);
long startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(2011, 10, 24, 8, 0);
long endMillis = endTime.getTimeInMillis();
Cursor cur = null;
ContentResolver cr = getContentResolver();
// The ID of the recurring event whose instances you are searching
// for in the Instances table
String selection = Instances.EVENT_ID + " = ?";
String[] selectionArgs = new String[] {"207"};
// Construct the query with the desired date range.
Uri.Builder builder = Instances.CONTENT_URI.buildUpon();
ContentUris.appendId(builder, startMillis);
ContentUris.appendId(builder, endMillis);
// Submit the query
cur = cr.query(builder.build(),
INSTANCE_PROJECTION,
selection,
selectionArgs,
null);
while (cur.moveToNext()) {
String title = null;
long eventID = 0;
long beginVal = 0;
// Get the field values
eventID = cur.getLong(PROJECTION_ID_INDEX);
beginVal = cur.getLong(PROJECTION_BEGIN_INDEX);
title = cur.getString(PROJECTION_TITLE_INDEX);
// Do something with the values.
Log.i(DEBUG_TAG, "Event: " + title);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(beginVal);
DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
Log.i(DEBUG_TAG, "Date: " + formatter.format(calendar.getTime()));
}
}
日历意图
您的应用程序并不需要权限读取和写入日历数据。它可以替代由Android的日历应用程序,手头宽裕的读写操作该应用程序支持的意图。下表列出了日历提供支持的意图:
操作URI附加说明
视图
内容://com.android.calendar/time/ <ms_since_epoch>
你也可以指与CalendarContract.CONTENT_URI的URI。对于使用这种意图的一个例子,请参阅使用意图,查看日历数据。打开日历由<ms_since_epoch>指定的时间。没有。
视图
内容://com.android.calendar/events/ <事项标识>
你也可以指与Events.CONTENT_URI的URI。对于使用这种意图的一个例子,请参阅使用意图,查看日历数据。看<EVENT_ID>指定的事件。 CalendarContract.EXTRA_EVENT_BEGIN_TIME
CalendarContract.EXTRA_EVENT_END_TIME
编辑
内容://com.android.calendar/events/ <事项标识>
你也可以指与Events.CONTENT_URI的URI。对于使用这种意图的一个例子,请参阅使用意图编辑的事件。编辑通过<EVENT_ID>指定的事件。 CalendarContract.EXTRA_EVENT_BEGIN_TIME
CalendarContract.EXTRA_EVENT_END_TIME
编辑
插
内容://com.android.calendar/events
你也可以指与Events.CONTENT_URI的URI。对于使用这种意图的一个例子,请参阅使用意图插入事件。创建活动。任何下表中列出的临时演员。
下表列出了日历提供程序支持的意图演员:
意向额外说明
Events.TITLE名称的事件。
CalendarContract.EXTRA_EVENT_BEGIN_TIME事件开始时间从时代毫秒。
CalendarContract.EXTRA_EVENT_END_TIME活动结束从时代毫秒的时间。
CalendarContract.EXTRA_EVENT_ALL_DAY一个布尔值,表明事件是一整天。值可以是真或假。
事件的Events.EVENT_LOCATION位置。
Events.DESCRIPTION事件描述。
那些Intent.EXTRA_EMAIL的电子邮件地址邀请作为一个逗号分隔的列表。
Events.RRULE事件的重复规则。
Events.ACCESS_LEVEL事件是否是私有还是公有。
Events.AVAILABILITY如果此事件计数为忙碌的时间或者是说可以实现预定的空闲时间。
以下部分描述了如何使用这些意图。
使用意图插入事件
使用INSERT意图让你的应用手离开事件插入任务日历本身。通过这种方法,您的应用程序甚至不需要有包含在其清单文件中WRITE_CALENDAR权限。
当用户运行使用这种方法的应用程序,该应用程序将他们的日历完成添加事件。在INSERT意图使用额外的字段来预填充形式在日历事件的细节。然后,用户可以取消该事件,根据需要编辑的形式,或者事件保存到他们的日历。
下面是一个代码段时间表于2012年1月19日的事件,从上午7:30运行到上午8:30请注意以下有关此代码段:
它指定Events.CONTENT_URI作为URI。
它使用CalendarContract.EXTRA_EVENT_BEGIN_TIME和CalendarContract.EXTRA_EVENT_END_TIME额外的字段与事件的时间预先填充表单。这些时间的数值必须从时代UTC毫秒。
它使用Intent.EXTRA_EMAIL额外的领域提供一个逗号分隔的受邀者名单,通过电子邮件地址指定。
Calendar beginTime = Calendar.getInstance();
beginTime.set(2012, 0, 19, 7, 30);
Calendar endTime = Calendar.getInstance();
endTime.set(2012, 0, 19, 8, 30);
Intent intent = new Intent(Intent.ACTION_INSERT)
.setData(Events.CONTENT_URI)
.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis())
.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis())
.putExtra(Events.TITLE, "Yoga")
.putExtra(Events.DESCRIPTION, "Group class")
.putExtra(Events.EVENT_LOCATION, "The gym")
.putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY)
.putExtra(Intent.EXTRA_EMAIL, "[email protected],[email protected]");
startActivity(intent);
使用意图编辑事件
您可以直接更新的事件,如更新事件的描述。但是,使用编辑意图允许没有权限来编辑事件移交给日历应用程序的应用程序。当用户完成编辑他们的日历事件,他们回到了原来的应用程序。
这里是设置一个新的标题为指定的事件,并允许用户在日历编辑事件的意图的一个例子。
long eventID = 208;
Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
Intent intent = new Intent(Intent.ACTION_EDIT)
.setData(uri)
.putExtra(Events.TITLE, "My New Title");
startActivity(intent);
使用意图,查看日历数据
日历提供商提供了两种不同的方式使用该视图意图:
要打开日历到一个特定的日期。
要查看事件。
下面的例子说明如何打开日历特定日期的例子:
// A date-time specified in milliseconds since the epoch.
long startMillis;
...
Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon();
builder.appendPath("time");
ContentUris.appendId(builder, startMillis);
Intent intent = new Intent(Intent.ACTION_VIEW)
.setData(builder.build());
startActivity(intent);
下面的例子说明如何打开事件查看一个例子:
long eventID = 208;
...
Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
Intent intent = new Intent(Intent.ACTION_VIEW)
.setData(uri);
startActivity(intent);
同步适配器
有在如何在应用程序和同步适配器访问日历提供商只有轻微的差异:
一个同步适配器需要指定它是通过设置CALLER_IS_SYNCADAPTER为true的同步适配器。
一个同步适配器需要提供ACCOUNT_NAME和ACCOUNT_TYPE作为URI查询参数。
一个同步适配器有写权限比应用程序或窗口小部件多个列。例如,一个应用程序只能修改一个日历的一些特点,比如它的名称,显示名称,可见性设置和日历是否同步。相比之下,同步适配器不仅可以访问这些列,但许多其他国家,如日历颜色,时区,访问级别,位置等。然而,同步适配器被限制在ACCOUNT_NAME与ACCOUNT_TYPE它指定。
这是一个辅助方法,你可以用它来返回一个URI与一个同步适配器使用:
static Uri asSyncAdapter(Uri uri, String account, String accountType) {
return uri.buildUpon()
.appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true")
.appendQueryParameter(Calendars.ACCOUNT_NAME, account)
.appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType).build();
}