4

我想在設置屏幕中顯示Android中安裝的日曆列表並選擇其中的一個。我在android應用程序Cal中看到了這個功能。 在Cal應用程序中安裝的日曆列表的屏幕截圖可以找到here如何顯示在Android的設置屏幕中安裝的日曆的列表

我想知道的是「是否可以在res/XML下使用<偏好>顯示日曆列表?」?

我一定要選擇使用PackageManager找到所有已安裝的應用程序列表,只顯示日曆應用的日曆列表?

我試着用下面的方法

<Preference android:title="@string/pref_select_calendar" > 
    <intent 
     android:action="android.intent.action.PICK" 
     android:data="content://calendar/calendars" /> 
</Preference> 

但我有android.content.ActivityNotFoundException使用<偏好>:無活動來處理意圖

{ act=android.intent.action.PICK dat=content://calendar/calenders } 

我缺少什麼?或者我嘗試的方法不正確? 任何指針都會非常有幫助。 謝謝。

回答

5

您必須查詢可用日曆的CalendarProvider(可從API級別14獲得)的日曆表。下面的代碼片段將告訴你如何:

final String[] EVENT_PROJECTION = new String[]{ 
     CalendarContract.Calendars._ID, 
     CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, 
     CalendarContract.Calendars.CALENDAR_COLOR 
    }; 

    final ContentResolver cr = getContentResolver(); 
    final Uri uri = CalendarContract.Calendars.CONTENT_URI; 
    Cursor cur = cr.query(uri, EVENT_PROJECTION, null, null, null); 
    final List<CalendarInfo> result = Lists.newArrayList(); 

    while (cur.moveToNext()) { 
     /* do something with the cursor: 
      Long id = cur.getLong(0); 
      String name = cur.getString(1); 
      int color = cur.getInt(2))); 
     */ 
    } 

因爲你正在做的工作IO(供應商基本都是SQLite數據庫),這是一個堅實的主意,一切包裝成一個獨立的(非UI)線程;我會去RxJava

如果您不喜歡玩遊標,查詢和樣板代碼,請使用CalendarWrapper庫。它負責映射對象和數據庫行的映射,CRUD操作可以用對象方法執行。例如,在你的情況單行會做的魔力:

final List<Calendar> calendars = Calendar.getCalendarsForQuery(null, null, null, getContentResolver()); 

後你得到的可用日曆的保持,只是把它們放在一個列表,並顯示在一個對話框,這是最簡單的方法。

+0

謝謝。您的解決方案完全按照我想要的方式工作但正如你所提到的,它只適用於14級以上的API。有沒有類似的解決方案支持從GingerBread版本或至少從HoneyComb? – lovubuntu

+0

AFAIK沒有官方的,內置的方式來做到這一點(你在你的問題中提到過Cal - 上述應用程序僅適用於4.0+設備)。不過,您可以使用Google日曆API(https://developers.google.com/google-apps/calendar/)並添加一些額外的代碼。 –

+0

順便說一句,如果你發現我的答案是正確的,請接受它。 –

相關問題