【51CTO精选译文】Android手机一般都内置一个日程表(Calendar)应用。第三方应用程序可以利用日程表内容提供程序的接口,实现阅读用户日程安排信息和在日程表中安排新事件。这个日程表应用可以直接与用户的谷歌日程表应用实现内容同步。
不幸的是,并没有任何文档来描述在Android上整合日程表应用,或者类似联系人应用的其它应用。本文中的所有信息均来自于对谷歌日程表应用内容提供程序的逆向工程。这个接口经常发生变化,而且支持的功能有限。但是,对某些类型的应用程序来说,整合日程表应用可能是一个非常强大的功能。
本文中的代码已经在Android 2.0 SDK以前的版本上进行过测试。由于目前市场上没有Android 2.0手机,我们还不能确保它可以运行在哪些即将发布的设备上。我们在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模拟器中,因此所有测试和开发工作必须在安装了日程表应用的真机上进行,使用模拟器无法启动相应的提供程序。日程表应用和内容提供程序被包含在支持谷歌服务的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);
现在,这个查询将返回所有日程安排,其中包括那些未处于激活状态的安排。为了只获得活跃日程安排的列表,我们需要限制我们的查询只返回“selected”字段值为真的记录:
- 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)、习惯性(值为1)或取消(值为2):
- event.put("eventStatus", 1);
你还可以控制谁可以查看它,设定其可见性为默认(值为0)、机密(值为1)、私有(值为2)或公开(值为3):
- event.put("visibility", 0);
你可以控制该事件是否触发告警:
- event.put("hasAlarm", 1);
一旦日程表事件被正确配置后,我们就可以使用ContentResolver来插入这条新日程表安排到具有合适Uri的日程表事件中:
- Uri eventsUri = Uri.parse("content://calendar/events");
- Uri url = getContentResolver().insert(eventsUri, event);
#T#insert()方法的调用可以建立与程表内容提供程序的联系,并尝试插入该条目到相应的用户日程表中。如果你找到日程表应用并启动它,你会看到你的日程表条目已经在相应日程表中。如果你使用谷歌在线日程表服务,由于日程表应用具有自动同步功能,你也会看到该条目已经出现于在线服务中。
增加一个重复发生事件到日程表
你还可以配置重发性日程表事件。你只需要按照重发性规则的形式为该事件增加几个字段即可。该规则的详细说明基于RFC2445。
Android应用能够与许多Android手机用户的日程表应用紧密配合。日程表功能需要通过内容提供程序接口来访问,这让第三方应用程序可以阅读日程表信息和增加新日程安排。
原文:Working with the Android Calendar 作者:Shane Conder