¿Cómo leer y editar eventos del calendario de Android con la nueva API de Android 4.0 Ice Cream Sandwich?

Estamos intentando mostrarle a los usuarios la vista de calendario Ice Cream Sandwich, cuando quieren agregar un nuevo evento. Solo podemos probar esto en emulador.

El otro problema es que no podemos encontrar ejemplos de cómo usar CalendarProvider. Esta es la clase correcta cuando se trata de lidiar con el calendario Sandwich?

¿Sería más fácil hacerlo con Google Gdata API?

[EDITAR] Entonces, lo que conseguimos trabajando fue agregar un evento al calendario, pero no fue a través de la API, abrimos el calendario en la vista correcta. Pero ahora el problema es que no funciona en el emulador porque no hemos podido sincronizar el calendario.

Entonces, la pregunta es: ¿cómo leer y posiblemente editar eventos del calendario de Android usando la nueva API de Android 4.0 Ice Cream Sandwich?

Aquí hay un código que te permitirá agregar un evento directamente:

import android.content.ContentResolver; import android.content.ContentValues; import android.net.Uri; import android.provider.CalendarContract; import java.util.Calendar; // Construct event details long startMillis = 0; long endMillis = 0; Calendar beginTime = Calendar.getInstance(); beginTime.set(2012, 9, 14, 7, 30); startMillis = beginTime.getTimeInMillis(); Calendar endTime = Calendar.getInstance(); endTime.set(2012, 9, 14, 8, 45); endMillis = endTime.getTimeInMillis(); // Insert Event ContentResolver cr = getContentResolver(); ContentValues values = new ContentValues(); TimeZone timeZone = TimeZone.getDefault(); values.put(CalendarContract.Events.DTSTART, startMillis); values.put(CalendarContract.Events.DTEND, endMillis); values.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone.getID()); values.put(CalendarContract.Events.TITLE, "Walk The Dog"); values.put(CalendarContract.Events.DESCRIPTION, "My dog is bored, so we're going on a really long walk!"); values.put(CalendarContract.Events.CALENDAR_ID, 3); Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI, values); // Retrieve ID for new event String eventID = uri.getLastPathSegment(); 

Necesitará el CALENDAR_ID, así que aquí le mostramos cómo consultar la lista de calendarios:

 Uri uri = CalendarContract.Calendars.CONTENT_URI; String[] projection = new String[] { CalendarContract.Calendars._ID, CalendarContract.Calendars.ACCOUNT_NAME, CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, CalendarContract.Calendars.NAME, CalendarContract.Calendars.CALENDAR_COLOR }; Cursor calendarCursor = managedQuery(uri, projection, null, null, null); 

Deberá solicitar el permiso android.permission.READ_CALENDAR para que todo esto funcione.

Si desea evitar tener que solicitar permisos, también puede solicitar a la aplicación Calendario que cree un nuevo evento en su nombre mediante una Intent :

 Intent intent = new Intent(Intent.ACTION_INSERT) .setType("vnd.android.cursor.item/event") .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis()) .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis()) .putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY , false) // just included for completeness .putExtra(Events.TITLE, "My Awesome Event") .putExtra(Events.DESCRIPTION, "Heading out with friends to do something awesome.") .putExtra(Events.EVENT_LOCATION, "Earth") .putExtra(Events.RRULE, "FREQ=DAILY;COUNT=10") .putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY) .putExtra(Events.ACCESS_LEVEL, Events.ACCESS_PRIVATE) .putExtra(Intent.EXTRA_EMAIL, "my.friend@example.com"); startActivity(intent); 

Puede usar el siguiente código para configurar la zona horaria y funciona para mí

 TimeZone timeZone = TimeZone.getDefault(); values.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone.getID()); 

Asegúrese de que no esté utilizando ‘visibilidad’ para dispositivos ICS y JellyBean (apiLevel> = 14)

Prueba esto –

 ContentValues values= new ContentValues(); int apiLevel = android.os.Build.VERSION.SDK_INT; if(apiLevel<14) values.put("visibility", 0); 

Use visibilidad solo si la versión del dispositivo es menor que 14 (ICS)

Creé el siguiente método para manejar la flexibilidad de TIMEZONE

// Convirtiendo TimeZone en GMT para guardar en Db local para evitar // Controversia sobre el servidor

 private String convertDateTimeZone(long originalDate) { String newDate = ""; Date date = new Date(originalDate); DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss"); Date parsed = null; try { parsed = formatter.parse(formatter.format(date).toString()); TimeZone tz = TimeZone.getTimeZone("GMT"); SimpleDateFormat destFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); destFormat.setTimeZone(tz); newDate = destFormat.format(parsed); } catch (Exception e) { } return newDate; } 

Usé el siguiente código para leer todos los eventos en el Calendario.

 public boolean isEventInCal(Context context, String cal_meeting_id) { Cursor cursor = context.getContentResolver().query( Uri.parse("content://com.android.calendar/events"), new String[] { "_id" }, " _id = ? ", new String[] { cal_meeting_id }, null); if (cursor.moveToFirst()) { // will give all events return true; } return false; } 
 public static ArrayList readCalendarEvent(Context context) { Cursor cursor = context.getContentResolver() .query( Uri.parse("content://com.android.calendar/events"), new String[] { "calendar_id", "title", "description", "dtstart", "dtend", "eventLocation" }, null, null, null); cursor.moveToFirst(); // fetching calendars name String CNames[] = new String[cursor.getCount()]; // fetching calendars id nameOfEvent.clear(); startDates.clear(); endDates.clear(); descriptions.clear(); Log.d("cnameslength",""+CNames.length); if (CNames.length==0) { Toast.makeText(context,"No event exists in calendar",Toast.LENGTH_LONG).show(); } for (int i = 0; i < CNames.length; i++) { nameOfEvent.add(cursor.getString(1)); startDates.add(getDate(Long.parseLong(cursor.getString(3)))); endDates.add(getDate(Long.parseLong(cursor.getString(4)))); descriptions.add(cursor.getString(2)); CNames[i] = cursor.getString(1); cursor.moveToNext(); Log.d("datacur",""+nameOfEvent.get(i)); Log.d("datacur",""+startDates.get(i)); Log.d("datacur",""+endDates.get(i)); Log.d("datacur",""+descriptions.get(i)); String filename=nameOfEvent.get(i)+"::"+startDates.get(i)+"::"+endDates.get(i)+"::"+descriptions.get(i); generateNoteOnSD(context,nameOfEvent.get(i),filename); } return nameOfEvent; } public static void generateNoteOnSD(Context context, String sFileName, String sBody) { try { File root = new File(Environment.getExternalStorageDirectory(), "Notes"); if (!root.exists()) { root.mkdirs(); } File gpxfile = new File(root, sFileName); FileWriter writer = new FileWriter(gpxfile); writer.append(sBody); writer.flush(); writer.close(); Toast.makeText(context, "Successfully Backup Created", Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } }