2012-09-17 22 views
10

Sto provando a creare un calendario sul mio account da riempire con gli eventi che ottengo da alcuni siti web. Ho cercato e trovato un nuovo esempio di calendario Android 4.0 che ho modificato per ottenere ciò di cui ho bisogno. Il problema è che il calendario è stato creato, pieno di eventi ma non sincronizzato con il calendario di Google, quindi nella prossima sincronizzazione viene cancellato. Il funcion che uso sono questi:Crea nuovo calendario sincronizzato con Android api

Questo è quello per aggiungere il nuovo calendario, se non lo fanno alreay esistono:

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; 
    } 

e quella creare il nuovo evento senza interazione:

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; 
} 

Non sono così esperto in programmazione Android quindi penso che sia una domanda stupida =) ho letto che accountName e tipo di account devono essere gli stessi di quello memorizzato sul dispositivo Android, altrimenti l'evento è annullato. Ottengo accountName da Android API e penso che siano corretti. Il tipo di conto sembra funzionare per altro ....

Grazie a chiunque mi aiuti!

+0

domande stupide, solo quelli che non conoscono ancora la risposta :) – Codeman

risposta

1

Secondo il Javadoc per CalendarContract.Calendars:

"calendari sono stati progettati per essere gestito principalmente da un adattatore di sincronizzazione e l'inserimento di nuovi calendari dovrebbe essere fatto come un adattatore di sincronizzazione".

Se non si è un adattatore di sincronizzazione (se si è solo un'app arbitraria, non si è un adattatore di sincronizzazione), ciò potrebbe spiegare perché il nuovo calendario non viene sincronizzato come ci si aspetterebbe.

2

Non è possibile per ora.

Dopo un sacco di google non sono riuscito a trovare un modo per creare un nuovo calendario sincronizzabile nell'account Gmail (tipo di account "com.google"). Ho provato questi scenari:
1. senza SyncAdapter e ho lo stesso comportamento: il calendario viene visualizzato nell'app di Google Calendar esterna con tutti gli eventi aggiunti ma poco dopo (ad esempio dopo un paio di secondi) tutti gli eventi e il calendario scompaiono.
2. con SyncAdapter e autenticatore com.google - ottengo un errore durante il processo
3. con SyncAdapter e com.example autenticatore - possibile creare calendario, ma non in account Gmail

Nota è possibile creare nuovo account e crea un nuovo calendario per quell'account (utilizzando SyncAdapter, scenario 3) ma non è un account Gmail quindi il calendario non è sincronizzabile con il calendario di Gmail (ad esempio se accedi all'account Gmail nel browser web e apri Google Calendar quel calendario che hai appena creato non mostrerà).

2

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

public String finale statica ACCOUNT_TYPE_LOCAL

aggiunte a livello di API 14 Un tipo conto speciale per i calendari non associate a qualsiasi account. Normalmente i calendari che non corrispondono ad un account sul dispositivo verranno rimossi. Impostando account_type su un calendario in questo modo si evita che venga cancellato se non corrisponde a un account esistente.

Vedere ACCOUNT_TYPE anche Costante Valore: "LOCAL"

2

Stesso problema che stavo affrontando. Dopo aver apportato il seguente cambiamento ora sto vedendo gli eventi permanentemente attaccati al mio calendario.

Nel metodo addEvent aggiungere la riga in basso

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

Codice in asSyncAdapter è come sotto

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(); 
    } 
Problemi correlati