5

Androidにインストールされているカレンダーの一覧を設定画面に表示して、その中から1つを選択したいと思います。この機能は、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 操作を実行できます。たとえば、あなたの場合、1行で魔法がかかります:

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

使用可能なカレンダーを把握したら、それらをリストに入れてダイアログに表示するのが最も簡単な方法です。

于 2014-01-13T22:20:58.800 に答える