日曆的Intent對象android
你應用程序不須要讀寫日曆數據的權限,它可使用Android的Calendar應用程序支持的Intent對象來替代你的應用程序的讀寫權限。下表列出了Calendar提供器支持的Intent對象:app
動做ide |
資源標識(URI)ui |
描述spa |
附加功能對象 |
VIEW事件 |
content://com.android.calendar/time/<ms_since_epoch>ci 也可以用CalendarContract.CONTENT_URI來引用這個URI資源 |
打開由<ms_since_epoch>指定時間的日曆get |
無 |
VIEW |
content://com.android.calendar/events/<event_id> 也能使用Events。CONTENT_URI來引用這個URI。 |
查看由<event_id>指定的的事件 |
CalendarContract.EXTRA_EVENT_BEGIN_TIME CalendarContract.EXTRA_EVENT_END_TIME |
EDIT |
Content://com.android.calendar/events/<event_id> 也能使用Events.CONTENT_URI來引用這個URI |
編輯由<event_id>指定的事件 |
CalendarContract.EXTRA_EVENT_BEGIN_TIME CalendarContract.EXTRA_EVENT_END_TIME |
INSERT |
content://com.android.calendar/events 也可以使用Events.CONTENT_URI來引用這個URI |
建立一個事件 |
在下表中列出的任意附加功能 |
下表列出了Calendar提供器支持的Intent對象的附加功能:
Intent對象附加功能 |
描述 |
Events.TITLE |
給事件命名 |
CalendarContract.EXTRA_EVENT_BEGIN_TIME |
從紀元開始用毫秒設定事件的開始時間 |
CalendarContract.EXTRA_EVENT_END_TIME |
從紀元開始用毫秒設定事件的結束時間 |
CalendarContract.EXTRA_EVENT_ALL_DAY |
一個布爾值,指定事件是不是全天的。 |
Events.EVENT_LOCATION |
事件的地點 |
Events.DESCRIPTION |
事件的描述 |
Intent.EXTRA_EMALL |
用逗號分開的受邀者電子郵件地址列表 |
Events.RRULE |
事件的重複規則 |
Events.ACCESS_LEVEL |
事件是私有仍是共有的 |
Events.AVAILABILITY |
預約事件是在忙時計數仍是在閒時計數 |
如下介紹如何使用這些Intent對象:
1. 使用插入事件的Intent對象
使用INSERT類型的Intent對象會讓你的應用程序把事件的插入的任務交給Calendar應用本身。用這種方法,你的應用程序不須要在清單文件中生命WRITE_CALENDAR權限。
當用戶運行使用這種方法的應用程序時,應用程序會藉助Intent對象把事件信息發送給Calendar應用程序來完成添加事件的處理。 INSERT類型的Intent對象使用附加字段來預裝一個帶有Calendar應用中事件詳細信息的表單。爲了編輯表單的須要,用戶能夠取消這個事件, 也能夠把事件保存到它們的日曆中。
如下代碼段規劃了一個在2011年1月19日上午7:30到8:30運行的事件。代碼說明以下:
A.它指定Events.CONTENT_URI做爲Uri;
B.它使用CalendarContract.EXTRA_EVENT_BEGIN_TIME和CalendarContract.EXTRA_EVENT_END_TIME附件字段來預裝帶有事件時間的表單。這些時間值必須是從紀元開始的UTC毫秒。
C.它使用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, "rowan@example.com,trevor@example.com");
startActivity(intent);
2. 使用編輯事件的Intent對象
你可以像「更新事件」一節中介紹的那樣直接更新一個事件。可是使用EDIT類型的Intent對象容許沒有權限的應用程序把要編輯的事件交給Calendar應用程序來處理。當用戶在Calendar應用程序中完成編輯事件的處理時,就會返回原來的應用程序。
下面這個例子使用Intent對象給特定的事件設置一個新的標題,而且要用戶在Calendar應用程序中編輯事件。
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);
3. 使用Intent對象來查看日曆數據
Calendar提供器提供了兩種使用VIEW類型Intent對象的方法
A.打開一個特殊日期的日曆
B.查看一個事件
下例子顯示怎樣打開一個特殊日期的日曆:
// 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);
同步適配器
應用程序和同步適配器訪問Calendar提供器的方式僅有較小的差別:
1. 同步適配器須要經過把CALLER_IS_SYNCADAPTER設置爲true來指定它是一個同步適配器;
2. 同步適配器須要提供一個ACCOUNT_NAME和ACCOUNT_TYPE做爲URI中的查詢參數;
3. 同步適配器有寫訪問權限的列比應用程序或widget要多。例如,應用程序只能修改一些日曆的字符,如名字、顯示名、可見設置、以及日曆是否被同步。同步 適配器不只可以訪問這些列,並且還有一些其餘列,如日曆的顏色、時區、訪問級別、地點等等。可是同步適配器要受到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(); }