編輯:高級開發
不幸的是,並沒有任何文檔來描述在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);
增加一個重復發生事件到日程表
你還可以配置重發性日程表事件。你只需要按照重發性規則的形式為該事件增加幾個字段即可。該規則的詳細說明基於RFC2445。
Android應用能夠與許多android手機用戶的日程表應用緊密配合。日程表功能需要通過內容提供程序接口來訪問,這讓第三方應用程序可以閱讀日程表信息和增加新日程安排。
原文:Working with the android Calendar 作者:Shane Conder
很多人對android2.0已經十分期待了,鑒於強大的功能性以及快速。android未來的市場將是十分廣闊的。搭載Android2.0源碼的摩托羅拉Droid手機已經上
Widget是android1.5版所引進的特性之一.Widget,可讓用戶在主屏幕界面及時了解程序顯示的重要信息.標准的android系統已包含幾個Widget的示例
Andrew Koenig也寫了一本現代android操作系統教程《Accelerated C++》,然而這麼多年來,android操作系統的狀況改善了嗎?androi
數據庫支持每個應用程序無論大小的生命線,除非你的應用程序只處理簡單的數據,那麼就需要一個數據庫系統存儲你的結構化數據,android使用SQLite數據庫,它是一個開源