使用CalendarContract阅读今天的所有活动 - Android 4.0+

Zai*_*ani 11 android android-calendar android-4.0-ice-cream-sandwich

我正在尝试使用Android的新日历API来阅读今天的所有日历活动.我无法在数据库查询中找到正确的选择以返回所有事件.似乎所有经常性和全天活动都被排除在选择之外.什么样的选择允许我从日历api获得今天的所有活动?

这是我目前的尝试:

    Cursor cur = null;
    String selection = "((" + CalendarContract.Events.DTSTART
            + " >= ?) AND (" + CalendarContract.Events.DTEND + " <= ?))";
    Time t = new Time();
    t.setToNow();
    String dtStart = Long.toString(t.toMillis(false));
    t.set(59, 59, 23, t.monthDay, t.month, t.year);
    String dtEnd = Long.toString(t.toMillis(false));
    String[] selectionArgs = new String[] { dtStart, dtEnd };
    cur = c.getContentResolver().query(CalendarContract.Events.CONTENT_URI,
            null, selection, selectionArgs, null);
Run Code Online (Sandbox Code Playgroud)

我不确定如何扩大选择范围或增加选择以获得重复活动和全天活动.任何帮助,将不胜感激.

Zai*_*ani 21

要获取今天的所有事件,包括重复发生的事件,您需要使用Instances表,即

Uri.Builder eventsUriBuilder = CalendarContract.Instances.CONTENT_URI
            .buildUpon();
ContentUris.appendId(eventsUriBuilder, timeNow);
ContentUris.appendId(eventsUriBuilder, endOfToday);
Uri eventsUri = eventsUriBuilder.build();
Cursor cursor = null;       
cursor = mContext.getContentResolver().query(eventsUri, columns, null, null, CalendarContract.Instances.DTSTART + " ASC");
Run Code Online (Sandbox Code Playgroud)

请注意,您必须将时间约束附加到事件uri,您不能以任何其他方式排序.

为了包括全天活动,只需将搜索范围扩大到前一天晚上11:59 PM和今晚12:00.


小智 5

您的条件仅为您提供严格限制在今天的事件.您应该检查在今天之前开始并在(多日事件)之后结束的那些.

对于重复发生的事件,我会手动检查它们.我没有找到另一种方式.

我使用类似的东西:

String selection = "((" + CalendarContract.Events.DTSTART + " <= ?) AND (" + CalendarContract.Events.DTEND + " >= ?)) OR (" + CalendarContract.Events.RRULE + " is not null )";

String[] selectionArgs = new String[] { dtEnd, dtStart};
Run Code Online (Sandbox Code Playgroud)

问候,

  • 要包含重复发生的事件,必须查询[CalendarContracts.Instance](http://developer.android.com/reference/android/provider/CalendarContract.Instances.html)类. (4认同)