2011-12-31 30 views
7

Tengo problemas para encontrar una solución a mi problema. Estoy intentando agregar varios eventos a mi calendario de Android, pero no sé cómo. Me dio encontré este código:Insertar varios eventos en el calendario de Android

 Calendar cal = Calendar.getInstance();    
      Intent intent = new Intent(Intent.ACTION_EDIT); 
      intent.setType("vnd.android.cursor.item/event"); 
      intent.putExtra("beginTime", cal.getTimeInMillis()); 
      intent.putExtra("allDay", true); 
      intent.putExtra("rrule", "FREQ=YEARLY"); 
      intent.putExtra("endTime", cal.getTimeInMillis()+60*60*1000); 
      intent.putExtra("title", "A Test Event from android app"+String.valueOf(i)); 
      startActivity(intent); 

pero todo lo que hace es que me envíe a mi calendario y me permite editar y manualmente inserto mi caso. Quiero insertar los eventos automáticamente, sin ir a mi aplicación de calendario. Además, puedo agregar solo un evento usando este código. Esto no es lo que yo quería. Tengo 2 matrices de cadenas, una que contiene la fecha y una que contiene el nombre del evento. ¿Alguien sabe si hay una manera de hacer esto? He estado buscando una solución por bastante tiempo y no he encontrado ninguna. Estaría agradecido si alguien me ayudó. ¡Gracias!

¡He resuelto el problema! ¡Muchas gracias! Pero ahora tengo otro problema que no puedo resolver. tengo este código:

 ContentValues cv = new ContentValues(); 
     cv.put("calendar_id", calIds[0]); 
     cv.put("title", title); 
     //cv.put("dtstart", dtstart); 
     //cv.put("dtend", dtend); 
     cv.put("rrule", "FREQ=MONTHLY"); 
     cv.put("description", comment); 
     Calendar start = Calendar.getInstance(); 
     start.set(2012, 0, 2, 8, 0, 0); 

     Calendar end = Calendar.getInstance(); 
     end.set(2012, 0, 2, 9, 0, 0); 

     long startTime = start.getTimeInMillis();  
     long endTime = end.getTimeInMillis(); 

     cv.put("dtstart", startTime); 
     cv.put("dtend", endTime); 
     //Insertion on the events of the calendar 
     cr.insert(Uri.parse("content://com.android.calendar/events"), cv); 

Inserta mi caso, pero no lo hace recurrentes. Quiero decir que mi evento aparece en 2jan2012 pero en 2jan2013 no y tampoco en 2014 y así sucesivamente. Así que abrí mi calendario en el teléfono e intenté editar mi evento y vi que donde debería seleccionar su ocurrencia, allí se muestra el 2 de enero de 2012, no el 2 de enero, como debería ser si fuera a personalizar mi evento de mi teléfono. Por otro lado, si trato de agregar un evento manualmente desde mi teléfono, funciona bien (es decir, puedo agregar un evento que ocurra anualmente).

Respuesta

5

android SDK no expone ninguna interfaz para manipular el calendario, pero puede encontrarlo desde el código fuente de Android. Android almacena el calendario en una base de datos sqlite interna, aunque está protegido del acceso directo, pero aún puede agregar/eliminar/actualizar/consultar datos del calendario a través de ContentResolver. Un pedazo de código para insertar un evento podría ser así:

public String addEvent(String calendarId, String title, long startTime, 
     long endTime, int allDay) { 
    ContentValues event = new ContentValues(); 
    event.put("calendar_id", calendarId); // "" for insert 
    event.put("title", title); 
    event.put("description", ""); 
    event.put("eventLocation", ""); 
    event.put("allDay", allDay); 
    event.put("eventStatus", 1); 
    event.put("transparency", 0); 
    event.put("dtstart", startTime); 
    event.put("dtend", endTime); 

    ContentResolver contentResolver = this.context.getContentResolver(); 
    Uri eventsUri = Uri.parse("content://com.android.calendar/calendars"); 
    Uri url = contentResolver.insert(eventsUri, event); 
    String ret = url.toString(); 
    return ret; 
} 

Al insertar un evento con éxito, representan una cadena URI del evento es devuelto por ContentResolver.insert, se puede consultar, actualizar o borrar más tarde . En SDK anteriores a SDK 8, el contenido uri del calendario es "content: // calendar/calendarios" que difiere de los SDks 8 y posteriores.
Mientras tanto, tenga cuidado con esas roms personalizadas. dado que la API del calendario no se menciona en los documentos del SDK, el proveedor del calendario podría ser modificado o incluso eliminado por algunos proveedores y operadores, por lo que es posible que deba probar su aplicación con muchos dispositivos.
¡Buena suerte!

+0

hecho de que finalmente añade una API oficial Calendario en el ICS: http://developer.android.com/reference/android/provider/CalendarContract.html –

+0

gracias @mbaird, es realmente una buena noticia! No estoy trabajando en Android por un tiempo y debería ponerme al día con la última versión. – hago

+0

He resuelto el problema pero ahora tengo otro problema. Si pudiera ayudarme una vez más estaría muy agradecido ... He editado mi pregunta sobre el otro tema. – Lara

0
public Uri createEvent(int calId, ICalEvent event) { 
     ContentValues eventValues = new ContentValues(); 

     eventValues.put("calendar_id", calId); 
     eventValues.put("title", event.getSummary()); 
     eventValues.put("description", event.getDescription()); 
     eventValues.put("eventLocation", event.getLocation()); 

// eventValues.put("UID", "ADE52556e6976657273697465323031302f323031312d323637392d302d3131"); 
// originalEvent 
     eventValues.put("originalEvent", event.getUid() + ";" + event.getLastModif().getTime()); 

     long startTime = event.getStart().getTime();//System.currentTimeMillis() + 1000 * 60 * 60; 
     long endTime = event.getEnd().getTime();//System.currentTimeMillis() + 1000 * 60 * 60 * 2; 

     eventValues.put("dtstart", (event.isWholeDayEvent() ? endTime : startTime)); 
     eventValues.put("dtend", endTime); 

     eventValues.put("allDay", (event.isWholeDayEvent() ? 1 : 0)); // 0 for false, 1 for true 
     eventValues.put("eventStatus", 1); 
     eventValues.put("visibility", 0); 
     eventValues.put("transparency", 0); 
     eventValues.put("hasAlarm", 0); // 0 for false, 1 for true 

     System.out.println("USING SYNC ACCOUNT " + sync_account); 

     eventValues.put("_sync_account_type", sync_account); 

     Uri eventsUri = Uri.parse(getCalendarUriBase()+"events"); 

     Uri insertedUri = activity.getContentResolver().insert(eventsUri, eventValues); 
     return insertedUri; 
    } 
Cuestiones relacionadas