5

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

我想知道的是“是否可以在 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: No Activity found to handle Intent

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

我错过了什么?还是我尝试的方法不正确?任何指针都会非常有帮助。谢谢你。

4

1 回答 1

8

您必须查询CalendarProvider(自 API 级别 14 起可用)的 Calendars 表以获取可用日历。以下代码段将向您展示如何:

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());

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

于 2014-01-13T22:20:58.800 回答