Es sieht aus wie Google CalendarContract in dieser Hinsicht durcheinander gebracht. Die Dokumentation ist nicht ganz klar darüber:
... Einfügen neuer Kalender sollte als Sync-Adapter erfolgen.
Die Art, wie dies formuliert wird, scheint mir, als gäbe es die geringe Chance, dass es funktionieren könnte. Praktisch gesprochen (eine Beurteilung Ihrer verknüpften anderen SO-Fragen) kann eine App, die CalendarContract verwendet, keine synchronisierten Kalender erstellen.
Sie möchten wirklich nicht all die Mühe machen, Ihren eigenen SyncAdapter zu erstellen. Ich habe es einmal für eine meiner Apps getan, weil ich eine zuverlässige Lösung für das Synchronisieren des Kalenderzugriffs auf Pre-Ice-Cream-Sandwich-Geräten wollte (wo CalendarContract noch nicht existiert).
Das ist eine Menge Arbeit. Es umfasst die Interaktion mit der Google Kalender-Webdienst-API (unter Einhaltung ihrer Zugriffsbeschränkungen), wobei eine lokale Kopie der Daten beibehalten und nur die Unterschiede synchronisiert werden. Letztendlich würde Ihr eigener SyncAdapter auch die Daten des bereits existierenden Google Kalender SyncAdapters duplizieren.
Was Sie als Workaround tun können, ist nur die Implementierung der erforderlichen "Kalender erstellen" Funktion direkt auf der Google Calendar online API. Es erfordert, dass Ihre App den Benutzer zur Autorisierung über android.permission.USE_CREDENTIALS
auffordert.
AccountManager kann verwendet werden, um das richtige Autorisierungstoken für den Zugriff auf die Google Kalender-API zu erhalten. Die Methode getAuthToken
erfordert einen Auth-Tokentyp-Parameter. Der richtige für Lese-/Schreibzugriff auf Kalender ist das folgende Zeichenfolgenliteral: "Manage your calendars"
.
Es gibt zwei große Probleme mit diesem Problem zu umgehen, obwohl:
Sie können nicht sicher wissen, ob die Kalendersynchronisierung Backend Verwendung von Google Kalender macht. Es ist leider eine Blackbox.
Sie können nicht sicher wissen, wann der Kalender-Sync-Adapter diese Änderungen einholen wird. Ich denke, es ist irgendwie möglich, eine erneute Synchronisierung zu erzwingen. Aber selbst dann wird Ihre App blockiert. Sie können nicht einfach basierend auf diesem neuen Kalender arbeiten und es sofort verwenden. Ihre App muss warten, bis die Synchronisierung erfolgt ist.
Sie können CalendarContract dafür abfragen. Lassen Sie Ihre App warten und suchen Sie nach Änderungen in einem Hintergrund-Thread, bis der neue Kalender angezeigt wird. Dann haben Sie seine lokale ID und ziehen weiter.
Es seit dieser Antwort fast ein Jahr gewesen ist, ist es ein Update? – Clocker
@Clocker Ich habe gerade die verknüpfte SO-Frage von Dragan angeschaut und jemand erwähnt, dass es möglich ist, lokale Kalender zu erstellen. Ich denke, das wäre der portabelste Workaround (portabel in einem Sinne, dass es nicht von einem bestimmten Kalender-Web-Service-Backend abhängt). – tiguchi