2012-09-17 19 views
10

que estoy tratando de crear un calendario en mi cuenta para llenar de eventos que recibo de algunos sitios web. He buscado y he encontrado un nuevo ejemplo de calendario de Android 4.0 que he modificado para obtener lo que necesito. El problema es que el calendario se crea lleno de eventos pero no sincronizado con el calendario de Google, por lo que en la siguiente sincronización se borrará. La funcion que uso son los siguientes:Crear nuevo calendario sincronizado con Android API

Este es el lugar para añadir el nuevo calendario si no lo hacen alreay existen:

public static Uri createCalendarWithName(Context ctx, String name,String accountName) { 

      Uri target = Uri.parse(CalendarContract.Calendars.CONTENT_URI.toString()); 
      target = target.buildUpon().appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true") 
      .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, accountName) 
      .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, "com.google").build(); 

      ContentValues values = new ContentValues(); 
      values.put(Calendars.ACCOUNT_NAME, accountName); 
      values.put(Calendars.ACCOUNT_TYPE, "com.google"); 
      values.put(Calendars.NAME, name); 
      values.put(Calendars.CALENDAR_DISPLAY_NAME, name); 
      values.put(Calendars.CALENDAR_COLOR, 0x00FF00); 
      values.put(Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_ROOT); 
      values.put(Calendars.OWNER_ACCOUNT, accountName); 
      values.put(Calendars.VISIBLE, 1); 
      values.put(Calendars.SYNC_EVENTS, 1); 
      values.put(Calendars.CALENDAR_TIME_ZONE, "Europe/Rome"); 
      values.put(Calendars.CAN_PARTIALLY_UPDATE, 1); 
      values.put(Calendars.CAL_SYNC1, "https://www.google.com/calendar/feeds/" + accountName + "/private/full"); 
      values.put(Calendars.CAL_SYNC2, "https://www.google.com/calendar/feeds/default/allcalendars/full/" + accountName); 
      values.put(Calendars.CAL_SYNC3, "https://www.google.com/calendar/feeds/default/allcalendars/full/" + accountName); 
      values.put(Calendars.CAL_SYNC4, 1); 
      values.put(Calendars.CAL_SYNC5, 0); 
      values.put(Calendars.CAL_SYNC8, System.currentTimeMillis()); 

      Uri newCalendar = ctx.getContentResolver().insert(target, values); 

      return newCalendar; 
    } 

y que uno crea el nuevo evento sin interacción:

public static Uri createEventWithName(Context ctx, long id, String name, String data) { 
     long startMillis = 0; 
     long endMillis = 0;  
     int id2=(int)id; 
     String[] divisi = data.split("/"); 
     Calendar beginTime = Calendar.getInstance(); 
     beginTime.set(2012,Integer.parseInt(divisi[0])-1, Integer.parseInt(divisi[1])); 
     startMillis = beginTime.getTimeInMillis(); 
     Calendar endTime = Calendar.getInstance(); 
     endTime.set(2012,Integer.parseInt(divisi[0])-1, Integer.parseInt(divisi[1])); 
     endMillis = endTime.getTimeInMillis(); 


     ContentValues cv = new ContentValues(); 
     cv.put(Events.TITLE, name); 
     cv.put(Events.DTSTART, startMillis); 
     cv.put(Events.DTEND, endMillis); 
     cv.put(Events.CALENDAR_ID, id2); 
     Log.d("aggiungo a calendario",Integer.toString(id2)); 
     cv.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().toString()); 
     //cv.put(Events.RRULE, "FREQ=DAILY;INTERVAL=2"); 

     Uri newEvent = ctx.getContentResolver().insert(CalendarContract.Events.CONTENT_URI, cv); 
     return newEvent; 
} 

No tengo tanta experiencia en programación de Android, así que creo que es una pregunta estúpida =) He leído que el Nombre de cuenta y el Tipo de cuenta deben ser los mismos que el almacenado en el dispositivo Android, de lo contrario, el evento se cancela. Obtengo el nombre de cuenta de la API de Android y creo que son correctos. El tipo de cuenta parece funcionar para otra ....

Gracias a cualquiera que me ayudan!

+0

No hay preguntas tontas, únicos que todavía no sabemos la respuesta a :) – Codeman

Respuesta

1

Según el Javadoc para CalendarContract.Calendars:

"Los calendarios están diseñados para ser manejados principalmente por un adaptador de sincronización y la inserción de nuevos calendarios debe ser hecho como un adaptador de sincronización."

Si no es un adaptador de sincronización (si solo es una aplicación arbitraria, no es un adaptador de sincronización), eso puede explicar por qué su nuevo calendario no se sincroniza como era de esperar.

2
No

posible por ahora.

Después de mucho googlear no pude encontrar una manera de crear nuevo calendario syncable en cuenta de Gmail (tipo de cuenta "com.google"). He intentado estos escenarios: 1.
sin SyncAdapter y consigo el mismo comportamiento - calendario aparece en el exterior aplicación Calendario de Google con todos los eventos que he ido añadiendo pero poco después (por ejemplo, después de par de segundos) y todos los eventos del calendario desaparecen. 2.
con SyncAdapter y el autenticador com.google - Me aparece un error durante el proceso de
3. con SyncAdapter y com.example autenticador - posible crear calendario, pero no en la cuenta de Gmail

Nota se puede crear una nueva cuenta y cree un nuevo calendario para esa cuenta (usando SyncAdapter, escenario 3) pero no es una cuenta de Gmail, entonces el calendario no se sincroniza con el Calendario de Gmail (por ejemplo, si inicia sesión en la cuenta de Gmail en el navegador y abre el Calendario de Google ese calendario que acaba de crear no se mostrará).

2

de http://developer.android.com/reference/android/provider/CalendarContract.html

público static final String ACCOUNT_TYPE_LOCAL

Agregado en el nivel de la API 14 Un tipo de cuenta especial para calendarios no asociadas a cualquier cuenta. Normalmente se eliminarán los calendarios que no coincidan con una cuenta en el dispositivo. Ajuste de la ACCOUNT_TYPE en un calendario a esto evitar que sea borrado si no coincide con una cuenta existente.

Véase también ACCOUNT_TYPE Constante Valor:

2

mismo problema que estaba enfrentando "LOCAL". Después de hacer el siguiente cambio ahora estoy viendo los eventos permanentemente adheridos a mi calendario.

En el método addEvent añadir la siguiente línea

Uri uri = getContentResolver().insert(asSyncAdapter(Events.CONTENT_URI,"[email protected]","com.gmail"), cv); 

Código de asSyncAdapter es la siguiente

static Uri asSyncAdapter(Uri uri, String account, String accountType) { 
     return uri.buildUpon() 
      .appendQueryParameter(android.provider.CalendarContract.CALLER_IS_SYNCADAPTER,"true") 
      .appendQueryParameter(Calendars.ACCOUNT_NAME, account) 
      .appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType).build(); 
    } 
Cuestiones relacionadas