如何在android的设置屏幕中显示已安装的日历列表

时间:2014-01-13 09:30:42

标签: android android-intent calendar android-calendar android-implicit-intent

我想在设置屏幕中显示已安装的日历列表,并在其中选择一个。我在Android应用程序Cal中看到了这个功能。 可以找到Cal app中已安装日历列表的屏幕截图here

我想知道的是“是否可以在res / XML下使用< preference>显示日历列表”?

我是否必须使用PackageManager选择日历列表以查找所有已安装应用程序的列表并仅显示日历应用程序?

我尝试使用< preference>使用以下方法

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

但我有android.content.ActivityNotFoundException:找不到处理Intent的Activity

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

我错过了什么?或者我正在尝试的方法不正确? 任何指针都会非常有用。 谢谢。

1 个答案:

答案 0 :(得分:6)

您需要查询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());

掌握了可用的日历后,只需将它们放入列表并在对话框中显示,这是最简单的方法。