2013-05-03 20 views
16

avrei fondamentalmente come riaprire il seguente post senza risposta:Android Calendario: come scrivere adattatore di sincronizzazione per il calendario INSERT

Vorrei fare uso di Android Calendar API Provider creare un calendario e inserire eventi in esso. Il calendario che viene creato non deve essere una copia locale. Deve essere sincronizzato con il calendario di Google (online). La documentazione dice in ordine per farlo devo usare un adattatore di sincronizzazione. Ma come posso scrivere un tale adattatore di sincronizzazione?

Finora ho trovato i due post seguenti ma nessuna soluzione.

voglio utilizzare l'API Calendario Android per questo e non l'API di Google in modo che gli utenti possano lavorare offline.

risposta

3

Sembra Google incasinato CalendarContract in questo senso. La documentazione non è del tutto chiaro:

... l'inserimento di nuovi calendari dovrebbe essere fatto come una scheda di sincronizzazione.

Il modo in cui questo è formulato mi sembra che ci siano le scarse possibilità che possa funzionare. Ma praticamente parlando (giudicando le altre domande SO collegate) un'app che utilizza CalendarContract non può creare calendari sincronizzati.

Davvero non si vuole passare attraverso tutti i problemi di creare il proprio SyncAdapter. L'ho fatto una sola volta per una delle mie app perché volevo una soluzione affidabile per l'accesso sincronizzato al calendario su dispositivi pre Ice Cream Sandwich (in cui CalendarContract non esiste ancora).

Questo è un sacco di lavoro. Implica l'interfaccia con l'API del servizio web di Google Calendar (rispettando i limiti di accesso), mantenendo una copia locale dei dati e sincronizzando solo le differenze. In definitiva il tuo SyncAdapter duplicherà anche i dati del già esistente Google Calendar SyncAdapter.

Quello che potresti fare come soluzione alternativa è implementare la funzione "Crea calendario" necessaria direttamente su Google Calendar online API. Richiede che l'app richieda l'autorizzazione tramite android.permission.USE_CREDENTIALS.

AccountManager può essere utilizzato per ottenere il token di autorizzazione corretto per l'accesso all'API di Google Calendar. Il metodo getAuthToken richiede un parametro di tipo di token di autenticazione. Quello corretto per l'accesso in lettura/scrittura del calendario è il seguente valore letterale stringa: "Manage your calendars".

Ci sono due grossi problemi con cui soluzione però:

  1. Non si può sapere con certezza se il backend sincronizzazione del calendario fa uso di Google Calendar. È sfortunatamente una scatola nera.

  2. Non si può sapere con certezza quando l'adattatore di sincronizzazione del calendario sta per recuperare queste modifiche. Immagino sia possibile forzare una risincronizzazione in qualche modo. Ma anche in quel caso, la tua app sarà bloccata. Non puoi semplicemente operare basandoti su quel nuovo calendario e usarlo subito. La tua app deve attendere fino alla sincronizzazione.

Si potrebbe sondare CalendarContract per questo. Lascia che la tua app attenda e cerchi le modifiche in un thread in background fino a quando non viene visualizzato il nuovo calendario. Quindi hai il suo ID locale e vai avanti.

+1

E 'passato quasi un anno da quando questa risposta, c'è un aggiornamento? – Clocker

+0

@Clocker Ho appena guardato la domanda collegata a SO di Dragan e qualcuno afferma che è possibile creare calendari locali. Immagino che sarebbe la soluzione più portabile (portatile, nel senso che non dipende da uno specifico back-end del servizio web del calendario). – tiguchi

2

Per ora non è possibile creare un calendario sincronizzabile con l'account Google (Gmail) a livello di programmazione utilizzando le API di Clanedar. SyncAdapter può essere utilizzato per creare nuovi account non Gmail e creare nuovi calendari ma questi non sono sincronizzabili con Google Calendar.

Maggiori dettagli qui: https://stackoverflow.com/a/19734278/237232

Problemi correlati