No se pueden leer eventos periódicos del calendario android mediante programación

He seguido el tutorial en este enlace – http://jimblackler.net/blog/?p=151&cpage=2#comment-52767 para acceder a la base de datos interna del calendario android (aunque no esté oficialmente soportado por el SDK). Funciona para todas las entradas excepto para eventos recurrentes. El cursor no devuelve ningún evento recurrente. Puede alguien ayudarme aquí. A continuación se muestra mi declaración de cursor –

String[] projection = new String[] { "title", "description", "dtstart", "eventLocation" }; String selection = "(calendar_id=" + calID + ")AND " + (now - window) + "<dtstart AND dtstart< " + (now + (window)); String sortorder = "dtstart ASC"; Cursor managedCursor = getCalendarManagedCursor(projection, selection, "events", sortorder); private Cursor getCalendarManagedCursor(String[] projection, String selection, String path, String sort) { Uri calendars = Uri.parse("content://calendar/" + path); Cursor managedCursor = null; try { managedCursor = getContentResolver().query(calendars, projection, selection, null, sort); } catch (IllegalArgumentException e) { Log.w(DEBUG_TAG, "Failed to get provider at [" + calendars.toString() + "]"); } if (managedCursor == null) { // try again calendars = Uri.parse("content://com.android.calendar/" + path); try { managedCursor = getContentResolver().query(calendars, projection, selection, null, sort); } catch (IllegalArgumentException e) { Log.w(DEBUG_TAG, "Failed to get provider at [" + calendars.toString() + "]"); }` 

Utilice la tabla Instances si necesita localizar eventos recurrentes.

Los URIs para consultarlo son:

  • instances/when/*/* – Todas las instancias entre dos veces (milisegundos)
  • instances/whenbyday/*/* – Todas las instancias entre dos veces (días)
  • instances/groupbyday/*/* – Igual que whenbyday , pero agrupado por el día de inicio

La lista de columnas en esa tabla son:

  • _id – El ID de esta instancia
  • event_id : el evento en el que se creó
  • begin – Hora de begin (milisegundos)
  • Fin – Hora de end (milisegundos)
  • startDay – Comienza el día de la instancia
  • endDay – Fin del día de la instancia
  • startMinute – Minutos desde la medianoche (0..1440)
  • endMinute – Minutos desde la medianoche

También puede utilizar las columnas de las tablas Events y Calendar .

Puedes ver un ejemplo en la misma página que has enlazado: http://jimblackler.net/blog/?p=151

Ejemplo:

 String[] projection = new String[] { "title", "description", "begin", "eventLocation" }; String selection = "calendar_id = " + calID; String path = "instances/when/" + (now - window) + "/" + (now + window); String sortOrder = "begin DESC"; Cursor managedCursor = getCalendarManagedCursor( projection, selection, path, sortorder); 

Edit: Parece que Google consiguió alrededor para documentar el proveedor de calendario. Navegar al Calendario Providier | Google Developers para obtener más información.

Finalmente hice este trabajo de la siguiente manera. Recuerde que DTSTART, DTEND, _ID no funcionan para la tabla Instances incluso si puede tener acceso a ellos. En su lugar, utilice BEGIN, END e Event_ID. Por favor, consulte estos 2 enlaces: Cómo obtener eventos de calendario con título incluyendo eventos recurrentes y eventos periódicos de calendario de Android tienen una fecha / hora de finalización errónea

  long now = System.currentTimeMillis(); Uri.Builder eventsUriBuilder = CalendarContract.Instances.CONTENT_URI.buildUpon(); ContentUris.appendId(eventsUriBuilder, Long.MIN_VALUE); ContentUris.appendId(eventsUriBuilder, Long.MAX_VALUE); Uri eventsUri = eventsUriBuilder.build(); Cursor cursor = context.getContentResolver().query( eventsUri, new String[] {CalendarContract.Instances.CALENDAR_ID, CalendarContract.Instances.TITLE, CalendarContract.Instances.DESCRIPTION, CalendarContract.Instances.BEGIN, CalendarContract.Instances.END, CalendarContract.Instances.EVENT_LOCATION, CalendarContract.Instances.EVENT_ID}, CalendarContract.Instances.BEGIN + " >= " + now + " and " + CalendarContract.Instances.BEGIN + " <= " + (now + 2592000000L) + " and " + CalendarContract.Instances.VISIBLE + " = 1", null, CalendarContract.Instances.BEGIN + " ASC"); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.