Lectura de todos los eventos de hoy con CalendarContract – Android 4.0+

Estoy intentando utilizar la nueva API del calendario de Android para leer todos los eventos del calendario de hoy. Tengo problemas para encontrar la selección correcta en la consulta de base de datos para devolver todos los eventos. Parece que todos los eventos recurrentes y todos los días se quedan fuera de la selección. ¿Qué opciones de selección me permitiría obtener todos los eventos de hoy del api del calendario?

Aquí está mi intento actual:

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

No estoy seguro de cómo ampliar la selección o añadir a ella para obtener los eventos recurrentes y todos los eventos de día. Cualquier ayuda sería apreciada.

5 Solutions collect form web for “Lectura de todos los eventos de hoy con CalendarContract – Android 4.0+”

Para obtener todos los eventos de hoy, incluidos los eventos periódicos, debe utilizar la tabla Instances, es decir

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

Tenga en cuenta que debe agregar las restricciones de tiempo a los eventos uri, no se puede ordenar de ninguna otra manera.

Con el fin de incluir todos los eventos de día, así, sólo ampliar la búsqueda a las 11:59 PM la noche anterior y 12:00 AM esta noche.

Sus condiciones sólo le dan los eventos que están estrictamente en los límites de hoy. Usted debe comprobar los que comienzan antes de hoy y terminan después (acontecimiento multidays).

Para eventos periódicos, los compruebo manualmente. No encontré otra manera.

Yo uso algo como:

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

Saludos,

Debería poder agregar CalendarContract.Events.ALL_DAY a su condición de selección para filtrar para todos los eventos ALL_DAY.

Sé que es un poco tarde, pero tuve una pregunta muy similar y tuve problemas para encontrar la respuesta que estaba buscando. La zona horaria forzada-UTC para los eventos de todo el día hizo las cosas complicadas. Aquí está mi solución:

  // "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 }; 

La consulta podría ser refinada para no necesitar 2 partes, pero esto era lo suficientemente bueno para mí.

En caso de que ayude, aquí es donde dayStart y dayEnd vino de:

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

Intente utilizar Instances.CONTENT_BY_DAY_URI. Compruebe esta respuesta para ver un ejemplo: https://stackoverflow.com/a/36622111/1219241

  • ¿Por qué el datepicker agrega un calendario en mi vista?
  • ¿Puedes autolink las fechas en la vista web de android?
  • Integración del calendario de PhoneGap / Cordova (Android)
  • Añadir evento a CalendarView
  • SyncAdapter, Manejo de ediciones locales y flags (DELETED, DIRTY y CALLER_IS_SYNCADAPTER)
  • No se puede eliminar un recordatorio de Calendar en Android
  • Crear evento de calendario desde mi aplicación sin recordatorios predeterminados
  • Agregar un calendario con ACCOUNT_TYPE_LOCAL a Android 4 hace que su calendario se bloquee
  • ¿Cómo puedo ayudar a un usuario a suscribirse a un calendario externo al calendario de Google en un dispositivo Android?
  • Android- Eliminar Calendarview de DatePickerDialogFragment
  • Agregar eventos al calendario nativo no funciona
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.