Android 日曆提供器(三)

日曆的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(); }

相關文章
相關標籤/搜索