usar sincronizar recuperar planner para google con compartir como celular calendarios calendario app android api calendar

recuperar - sincronizar calendario android



Crea un nuevo calendario sincronizado con la aplicaciĆ³n de Android (4)

Estoy intentando crear un calendario en mi cuenta para llenar los 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 función que uso son estas:

Este es para agregar el nuevo calendario si ya no existe:

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 ese 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 mucha experiencia en la 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 los almacenados en el dispositivo Android, sino 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 otros ....

¡Gracias a todos los que me ayudan!


De acuerdo con el Javadoc para CalendarContract.Calendars:

"Los calendarios están diseñados para ser administrados principalmente por un adaptador de sincronización y la inserción de nuevos calendarios debe hacerse 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.


No es posible por ahora.

Después de buscar en Google, no pude encontrar una forma de crear un nuevo calendario sincronizado en la cuenta de Gmail (tipo de cuenta "com.google"). He intentado estos escenarios:
1. sin SyncAdapter y obtengo el mismo comportamiento: el calendario aparece en la aplicación Google Calendar externa con todos los eventos que agregué, pero poco después (por ejemplo, después de unos segundos) desaparecen todos los eventos y el calendario.
2. con SyncAdapter y com.google authenticator: recibo un error durante el proceso
3. con SyncAdapter y com.example autenticador: es posible crear un calendario pero no en la cuenta de Gmail

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


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

public static final String ACCOUNT_TYPE_LOCAL

Agregado en el nivel de API 14 Un tipo de cuenta especial para calendarios no asociados con ninguna cuenta. Normalmente, los calendarios que no coinciden con una cuenta en el dispositivo serán eliminados. Establecer el tipo de cuenta en un calendario para esto evitará que se borre si no coincide con una cuenta existente.

Consulte también ACCOUNT_TYPE Valor constante: "LOCAL"


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

En el método addEvent agrega la siguiente línea

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

El código para asSyncAdapter es el 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(); }