Чтение всех сегодняшних событий с помощью CalendarContract – Android 4.0+

Я пытаюсь использовать новый API-интерфейс Android для чтения всех сегодняшних событий календаря. Мне трудно найти правильный выбор в запросе базы данных, чтобы вернуть все события. Кажется, что все повторяющиеся и вседневные события не учитываются. Какие аргументы выбора позволили бы мне получить все сегодняшние события из календаря 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); 

Я не уверен, как расширить выбор или добавить его для получения повторяющихся событий и событий на весь день. Любая помощь будет оценена по достоинству.

Чтобы получить все события сегодня, включая повторяющиеся события, вам нужно использовать таблицу экземпляров, т.е.

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

Обратите внимание, что вы должны добавить временные ограничения к событиям uri, вы не можете отсортировать их каким-либо другим способом.

Чтобы включить все дневные события, просто разверните поиск до 11:59 вечера прошлой ночью и 12:00 AM сегодня вечером.

Ваши условия дают только те события, которые строго соответствуют сегодняшним ограничениям. Вы должны проверить те, которые начинаются до сегодняшнего дня и заканчиваются после (многодневное мероприятие).

Для повторяющихся событий я проверяю их вручную. Я не нашел другого пути.

Я использую что-то вроде:

 String selection = "((" + CalendarContract.Events.DTSTART + " <= ?) AND (" + CalendarContract.Events.DTEND + " >= ?)) OR (" + CalendarContract.Events.RRULE + " is not null )"; String[] selectionArgs = new String[] { dtEnd, dtStart}; 

С Уважением,

Вы должны добавить CalendarContract.Events.ALL_DAY в свое условие выбора для фильтрации всех событий ALL_DAY.

Я знаю, что это немного поздно, но у меня был очень похожий вопрос, и мне трудно найти ответ, который я искал. Временная зона принудительного UTC для событий на весь день сделала вещи сложными. Вот мое решение:

  // "allDayStart" is an all-day event today, encoded in the default time zone Time allDayStart = new Time(); allDayStart.timezone=TimeZone.getDefault().toString(); allDayStart.set(dayStart.monthDay, dayStart.month, dayStart.year); // 2 time selections for the query: // 1) Between day-start and day-end (not all-day); or // 2) Equals today at 0:00:00 (all-day) in the default timezone String calSelection = "((" + Calendars.ACCOUNT_NAME + " = ?) " + "AND (" + Calendars.OWNER_ACCOUNT + "= ?) " + "AND (" + "((" + Events.DTSTART + ">= ?) " + "AND (" + Events.DTSTART + "<= ?) " + "AND (" + Events.ALL_DAY + "= ?) " + ") " + "OR ((" + Events.DTSTART + "= ?) " + "AND (" + Events.ALL_DAY + "= ?)" + ")" + ")" + ")"; String[] calSelectionArgs = new String[] { accountName, ownerName, dayStartInMillis.toString(), dayEndInMillis.toString(), "0", // during today, not all day allDayStartInMillis.toString(), "1" // Started today at default start-time for all-day events (all-day), default time zone }; 

Запрос может быть уточнен, чтобы не понадобилось 2 части, но это было достаточно для меня.

В случае, если это помогает, вот где dayStart и dayEnd пришли из:

  Time dayStart = new Time(); dayStart.setToNow(); dayStart.hour=0; dayStart.minute=0; dayStart.second=0; Time dayEnd = new Time(); dayEnd.set(dayStart); dayEnd.hour=dayStart.hour+23; dayEnd.minute=dayStart.minute+59; dayEnd.second=dayStart.second+59; Long dayStartInMillis = dayStart.toMillis(false); Long dayEndInMillis = dayEnd.toMillis(false) + 999; Long allDayStartInMillis = allDayStart.toMillis(false); 

Попробуйте использовать Instances.CONTENT_BY_DAY_URI. Проверьте этот ответ для примера – https://stackoverflow.com/a/36622111/1219241