Obtención de eventos del calendario

Mi problema es, tengo que hacer una aplicación de demostración en la que quiero leer los eventos del calendario de google, para que tengo insertar manualmente los eventos como el título del evento, el tiempo de los eventos y los detalles de los eventos en su conjunto. Ahora necesito sólo esos eventos forman ese calendario. Por lo que he intentado utilizar el gcode (google code) api que es proporcionar la clase api calendario. Pero todavía no puedo capaz de leer esos eventos ..

Ese código anterior es bastante horrible (y no parece funcionar en ICS – definitivamente los nombres de columna son diferentes)

La página aquí: http://developer.android.com/guide/topics/providers/calendar-provider.html

Ofrece una visión mucho mejor. Un código (mucho) más simple para recuperar calendarios:

public class CalendarContentResolver { public static final String[] FIELDS = { CalendarContract.Calendars.NAME, CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, CalendarContract.Calendars.CALENDAR_COLOR, CalendarContract.Calendars.VISIBLE }; public static final Uri CALENDAR_URI = Uri.parse("content://com.android.calendar/calendars"); ContentResolver contentResolver; Set<String> calendars = new HashSet<String>(); public CalendarContentResolver(Context ctx) { contentResolver = ctx.getContentResolver(); } public Set<String> getCalendars() { // Fetch a list of all calendars sync'd with the device and their display names Cursor cursor = contentResolver.query(CALENDAR_URI, FIELDS, null, null, null); try { if (cursor.getCount() > 0) { while (cursor.moveToNext()) { String name = cursor.getString(0); String displayName = cursor.getString(1); // This is actually a better pattern: String color = cursor.getString(cursor.getColumnIndex(CalendarContract.Calendars.CALENDAR_COLOR)); Boolean selected = !cursor.getString(3).equals("0"); calendars.add(displayName); } } } catch (AssertionError ex) { /*TODO: log exception and bail*/ } return calendars; } } 

¡Espero que esto ayude!

Ok encontré la respuesta de todo este concepto de cómo usar la integración de la aplicación de calendario de Google con el teléfono Android.

código:–

Primero se establece esta línea que va a leer los eventos de calendario de la forma de la otra clase de su clase que es actual es el ApplicationSettings.java.

calendar.readCalendar(ApplicationSettings.this);

 package com.mycalendarevents.android; import java.util.Date; import java.util.HashSet; import java.util.regex.Pattern; import android.content.ContentResolver; import android.content.ContentUris; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.text.format.DateUtils; public class ReadCalendar { static Cursor cursor; public static void readCalendar(Context context) { ContentResolver contentResolver = context.getContentResolver(); // Fetch a list of all calendars synced with the device, their display names and whether the cursor = contentResolver.query(Uri.parse("content://com.android.calendar/calendars"), (new String[] { "_id", "displayName", "selected"}), null, null, null); HashSet<String> calendarIds = new HashSet<String>(); try { System.out.println("Count="+cursor.getCount()); if(cursor.getCount() > 0) { System.out.println("the control is just inside of the cursor.count loop"); while (cursor.moveToNext()) { String _id = cursor.getString(0); String displayName = cursor.getString(1); Boolean selected = !cursor.getString(2).equals("0"); System.out.println("Id: " + _id + " Display Name: " + displayName + " Selected: " + selected); calendarIds.add(_id); } } } catch(AssertionError ex) { ex.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } // For each calendar, display all the events from the previous week to the end of next week. for (String id : calendarIds) { Uri.Builder builder = Uri.parse("content://com.android.calendar/instances/when").buildUpon(); //Uri.Builder builder = Uri.parse("content://com.android.calendar/calendars").buildUpon(); long now = new Date().getTime(); ContentUris.appendId(builder, now - DateUtils.DAY_IN_MILLIS * 10000); ContentUris.appendId(builder, now + DateUtils.DAY_IN_MILLIS * 10000); Cursor eventCursor = contentResolver.query(builder.build(), new String[] { "title", "begin", "end", "allDay"}, "Calendars._id=" + 1, null, "startDay ASC, startMinute ASC"); System.out.println("eventCursor count="+eventCursor.getCount()); if(eventCursor.getCount()>0) { if(eventCursor.moveToFirst()) { do { Object mbeg_date,beg_date,beg_time,end_date,end_time; final String title = eventCursor.getString(0); final Date begin = new Date(eventCursor.getLong(1)); final Date end = new Date(eventCursor.getLong(2)); final Boolean allDay = !eventCursor.getString(3).equals("0"); /* System.out.println("Title: " + title + " Begin: " + begin + " End: " + end + " All Day: " + allDay); */ System.out.println("Title:"+title); System.out.println("Begin:"+begin); System.out.println("End:"+end); System.out.println("All Day:"+allDay); /* the calendar control metting-begin events Respose sub-string (starts....hare) */ Pattern p = Pattern.compile(" "); String[] items = p.split(begin.toString()); String scalendar_metting_beginday,scalendar_metting_beginmonth,scalendar_metting_beginyear,scalendar_metting_begindate,scalendar_metting_begintime,scalendar_metting_begingmt; scalendar_metting_beginday = items[0]; scalendar_metting_beginmonth = items[1]; scalendar_metting_begindate = items[2]; scalendar_metting_begintime = items[3]; scalendar_metting_begingmt = items[4]; scalendar_metting_beginyear = items[5]; String calendar_metting_beginday = scalendar_metting_beginday; String calendar_metting_beginmonth = scalendar_metting_beginmonth.toString().trim(); int calendar_metting_begindate = Integer.parseInt(scalendar_metting_begindate.trim()); String calendar_metting_begintime = scalendar_metting_begintime.toString().trim(); String calendar_metting_begingmt = scalendar_metting_begingmt; int calendar_metting_beginyear = Integer.parseInt(scalendar_metting_beginyear.trim()); System.out.println("calendar_metting_beginday="+calendar_metting_beginday); System.out.println("calendar_metting_beginmonth ="+calendar_metting_beginmonth); System.out.println("calendar_metting_begindate ="+calendar_metting_begindate); System.out.println("calendar_metting_begintime="+calendar_metting_begintime); System.out.println("calendar_metting_begingmt ="+calendar_metting_begingmt); System.out.println("calendar_metting_beginyear ="+calendar_metting_beginyear); /* the calendar control metting-begin events Respose sub-string (starts....ends) */ /* the calendar control metting-end events Respose sub-string (starts....hare) */ Pattern p1 = Pattern.compile(" "); String[] enditems = p.split(end.toString()); String scalendar_metting_endday,scalendar_metting_endmonth,scalendar_metting_endyear,scalendar_metting_enddate,scalendar_metting_endtime,scalendar_metting_endgmt; scalendar_metting_endday = enditems[0]; scalendar_metting_endmonth = enditems[1]; scalendar_metting_enddate = enditems[2]; scalendar_metting_endtime = enditems[3]; scalendar_metting_endgmt = enditems[4]; scalendar_metting_endyear = enditems[5]; String calendar_metting_endday = scalendar_metting_endday; String calendar_metting_endmonth = scalendar_metting_endmonth.toString().trim(); int calendar_metting_enddate = Integer.parseInt(scalendar_metting_enddate.trim()); String calendar_metting_endtime = scalendar_metting_endtime.toString().trim(); String calendar_metting_endgmt = scalendar_metting_endgmt; int calendar_metting_endyear = Integer.parseInt(scalendar_metting_endyear.trim()); System.out.println("calendar_metting_beginday="+calendar_metting_endday); System.out.println("calendar_metting_beginmonth ="+calendar_metting_endmonth); System.out.println("calendar_metting_begindate ="+calendar_metting_enddate); System.out.println("calendar_metting_begintime="+calendar_metting_endtime); System.out.println("calendar_metting_begingmt ="+calendar_metting_endgmt); System.out.println("calendar_metting_beginyear ="+calendar_metting_endyear); /* the calendar control metting-end events Respose sub-string (starts....ends) */ System.out.println("only date begin of events="+begin.getDate()); System.out.println("only begin time of events="+begin.getHours() + ":" +begin.getMinutes() + ":" +begin.getSeconds()); System.out.println("only date begin of events="+end.getDate()); System.out.println("only begin time of events="+end.getHours() + ":" +end.getMinutes() + ":" +end.getSeconds()); beg_date = begin.getDate(); mbeg_date = begin.getDate()+"/"+calendar_metting_beginmonth+"/"+calendar_metting_beginyear; beg_time = begin.getHours(); System.out.println("the vaule of mbeg_date="+mbeg_date.toString().trim()); end_date = end.getDate(); end_time = end.getHours(); CallHandlerUI.metting_begin_date.add(beg_date.toString()); CallHandlerUI.metting_begin_mdate.add(mbeg_date.toString()); CallHandlerUI.metting_begin_mtime.add(calendar_metting_begintime.toString()); CallHandlerUI.metting_end_date.add(end_date.toString()); CallHandlerUI.metting_end_time.add(end_time.toString()); CallHandlerUI.metting_end_mtime.add(calendar_metting_endtime.toString()); } while(eventCursor.moveToNext()); } } break; } } } 

Aquí está la totalidad del código se va a publicar que simplemente se lee cada evento de su formulario de calendario con la ayuda de esa url de devolución que es para la versión 2.2 y superior:

 Uri.parse("content://com.android.calendar/instances/when").buildUpon(); 

Pl encontrar el bajo la versión inferior a 2,2 en android y utilizar esos eventos como lugar necesario …

Soy consciente de que se trata de una antigua publicación, pero encontré inspiración para optimizar la solución encontrada en la respuesta dada por Akash Takkar si alguien necesita una solución en un futuro próximo.

Los problemas


Específicamente, encontré algunos problemas en el código original:

  1. El bucle para recuperar eventos del calendario se rompió inmaduro
    • De este modo, sólo se recuperaron los eventos del primer calendario
  2. El primer evento en cada calendario se omitió mediante eventCursor.moveToFirst (); Que luego se mueve directamente al siguiente evento en el bucle while
  3. El id de los calendarios no se estableció correctamente en el eventCursor
    • "Calendars._id =" + 1, debe ser "Calendars._id =" + id,
  4. Sería difícil para otros especificar su propio intervalo de tiempo
  5. La solución actual no está orientada a objetos, lo que supondría muchas ventajas
  6. La legibilidad y documentación no es la mejor

La solución


Por este medio he creado una biblioteca Github que devuelve una lista de objetos de eventos en un intervalo de tiempo especificado que se puede encontrar en:

https://github.com/david-laundav/CalendarService

Los archivos de origen se pueden encontrar en "CalendarService / src / dk / CalendarService".

Casos de uso

La solución en sí contiene dos métodos diferentes para diferentes propósitos.

Primer caso de uso:

 CalendarService.readCalendar(class.this) // where class.this is either your class or the context 

Este método devolverá una lista de eventos para +/- 1 día

Segundo caso de uso:

También puede especificar su propio intervalo de tiempo:

 CalendarService.readCalendar(class.this, int days, int hours) 

Un ejemplo podría ser:

 CalendarService.readCalendar(class.this, 2, 5) 

Al hacerlo, devolverá una lista de eventos de +/- 2 días y +/- 5 horas.

El servicio se ha probado, pero por favor, dígame si experimenta algún problema.

Esta publicación es un poco antigua, pero aquí hay otra solución fácil para obtener datos relacionados con el proveedor de contenido de Calendar en Android:

Utilice esta lib: https://github.com/EverythingMe/easy-content-providers

Y ahora, obtén todos los calendarios:

 CalendarProvider calendarProvider = new CalendarProvider(context); List<Calendar> calendars = calendarProvider.getCalendars().getList(); 

Cada calendario tiene todos los campos, por lo que puede obtener cualquier información que necesite: id, nombre, calendarColor, ownerAccount, accountName, calendarAccessLevel, …

O, obtener todos los eventos de calendario específico:

 List<Event> calendars = calendarProvider.getEvents(calendar.id).getList(); 

Y también hay opción para obtener recordatorios, asistentes, instancias .

Funciona con listas o cursor y hay una aplicación de ejemplo para ver cómo se ve y funciona. De hecho, hay soporte para todos los proveedores de contenido Android como: Contactos, SMS, Llamadas, … Doc completo con todas las opciones: https://github.com/EverythingMe/easy-content-providers/wiki/Android-providers

Espero que ayudó 🙂

Utilice este código para obtener los eventos del calendario de un día.

 public static void readCalendarEvent(Context context) throws ParseException { ContentResolver contentResolver = context.getContentResolver(); Calendar calendar = Calendar.getInstance(); String dtstart = "dtstart"; String dtend = "dtend"; SimpleDateFormat displayFormatter = new SimpleDateFormat("MMMM dd, yyyy (EEEE)"); stime=displayFormatter.format(calendar.getTime()); SimpleDateFormat startFormatter = new SimpleDateFormat("MM/dd/yy"); String dateString = startFormatter.format(calendar.getTime()); long after = calendar.getTimeInMillis(); SimpleDateFormat formatterr = new SimpleDateFormat("hh:mm:ss MM/dd/yy"); Calendar endOfDay = Calendar.getInstance(); Date dateCCC = formatterr.parse("23:59:59 " + dateString); endOfDay.setTime(dateCCC); cursor = contentResolver.query(Uri.parse("content://com.android.calendar/events"), (new String[] { "calendar_id", "title", "description", "dtstart", "dtend","eventTimezone", "eventLocation" }), "(" + dtstart + ">" + after + " and " + dtend + "<" + endOfDay.getTimeInMillis() + ")", null, "dtstart ASC"); /*String[] COLS={"calendar_id", "title", "description", "dtstart", "dtend","eventTimezone", "eventLocation"}; cursor = contentResolver.query( CalendarContract.Events.CONTENT_URI, COLS,null, null, null);*/ gCalendar = new ArrayList<GoogleCalendar>(); try { if (cursor.getCount() > 0) { while (cursor.moveToNext()) { GoogleCalendar googleCalendar = new GoogleCalendar(); gCalendar.add(googleCalendar); int calendar_id = cursor.getInt(0); googleCalendar.setCalendar_id(calendar_id); String title = cursor.getString(1); googleCalendar.setTitle(title); String description = cursor.getString(2); googleCalendar.setDescription(description); String dtstart1 = cursor.getString(3); dt=convertDate(dtstart1,"hh:mm:ss"); googleCalendar.setDtstart(dt); String dtend1 = cursor.getString(4); googleCalendar.setDtend(dtend1); String eventTimeZone=cursor.getString(5); googleCalendar.setEventTimeZone(eventTimeZone); String eventlocation = cursor.getString(6); googleCalendar.setEventlocation(eventlocation); } } } catch (AssertionError ex) { ex.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } 
  • Utilizar la autenticación de inicio de sesión de cuenta de Google para aplicaciones en Android
  • ¿Puedo usar AccountManager para permitir que los usuarios inicien sesión con su cuenta de Google?
  • Android - Firebase Depurar certificado SHA1
  • Cómo asignar una imagen (mapa de bits) mediante programación a un contacto?
  • Vector sin conexión TileProvider que extiende google map api v2 en android
  • Android: GoogleAuthUtil.getToken - ¿De dónde viene el objeto de cuenta que se supone que viene?
  • Google Sheets API v4 - ¿Cómo insertar fila después de la última fila con valor?
  • Causa de inicio de sesión de Google: Causado por: java.util.ConcurrentModificationException
  • Problema con la calefacción de cristal de Google
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.