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

  • Hacer que un botón Datepicker tenga un aspecto similar al de la aplicación de calendario de Google
  • CalendarView: haga clic en Android
  • Evento calendario de Android CalendarContract con fechas de excepción
  • SyncAdapter, Manejo de ediciones locales y flags (DELETED, DIRTY y CALLER_IS_SYNCADAPTER)
  • Integración del calendario de PhoneGap / Cordova (Android)
  • Escuchar los cambios en el calendario de Android. (Sincronizar / Borrar / Insertar etc.)
  • ¿Hay alguna manera de cambiar dinámicamente un icono de aplicación Android como la aplicación de calendario?
  • Agregar un calendario con ACCOUNT_TYPE_LOCAL a Android 4 hace que su calendario se bloquee
  • Cómo adjuntar datos privados al evento de calendario android
  • Cambiar el estilo de CalendarView
  • Cómo leer los recordatorios en los calendarios de google
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.