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

lov*_*ntu 4 android calendar android-intent android-calendar android-implicit-intent

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

我想知道的是"是否可以使用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>
Run Code Online (Sandbox Code Playgroud)

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

{ act=android.intent.action.PICK dat=content://calendar/calenders }
Run Code Online (Sandbox Code Playgroud)

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

And*_*s K 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);
        */
    }
Run Code Online (Sandbox Code Playgroud)

由于您正在进行IO工作(提供程序基本上是SQLite数据库),因此将所有内容包装到单独的(非UI)线程中是一个可靠的想法; 我会选择RxJava.

如果您不喜欢使用游标,查询和样板代码,请使用CalendarWrapper库.它负责映射对象和数据库行,CRUD操作可以使用对象方法执行.例如,在你的情况下,一行就能发挥作用:

final List<Calendar> calendars = Calendar.getCalendarsForQuery(null, null, null, getContentResolver());
Run Code Online (Sandbox Code Playgroud)

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