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 quewhenbyday
, 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 debegin
(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");