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設備。該日歷功能是通過一條內容提供商的接口,允許第三方應用程序訪問日歷信息,並添加新日歷項。

