我基本上想重新打开以下未答复的帖子:
我想利用Android日历提供程序API来创建日历 并将事件插入其中。创建的日历不能是本地副本。 它必须与Google(在线)日历同步。文件中说 为了做到这一点,我必须使用同步适配器。但是我该如何编写这样的同步适配器?
到目前为止,我发现以下两个帖子但没有解决方案。
我想为此使用Android日历API,而不是Google API 用户可以离线工作。
答案 0 :(得分:4)
看起来Google在这方面弄乱了CalendarContract。文档并不完全清楚:
...插入新日历应该作为同步适配器完成。
这种措辞的方式在我看来似乎有可能起作用的可能性很小。但实际上(判断您链接的其他SO问题)使用CalendarContract的应用程序无法创建同步日历。
您真的不想经历创建自己的SyncAdapter的所有麻烦。我为我的一个应用程序做了一次,因为我想要一个可靠的解决方案,在冰淇淋三明治设备上同步日历访问(CalendarContract还不存在)。
那是很多工作。它涉及与Google日历网络服务API的接口(同时尊重其访问限制),保留数据的本地副本并仅同步差异。最终,您自己的SyncAdapter还会复制现有Google Calendar SyncAdapter的数据。
你可以做的解决方法就是实施必要的"创建日历"直接在Google Calendar online API上运行。
它要求您的应用通过android.permission.USE_CREDENTIALS
要求用户授权。
AccountManager可用于获取访问Google Calendar API的正确授权令牌。方法getAuthToken
需要auth令牌类型参数。用于日历读/写访问的正确字符串是以下字符串文字:"Manage your calendars"
。
但这种解决方法存在两个大问题:
您无法确定日历同步后端是否使用Google日历。不幸的是,它是一个黑盒子。
您无法确定日历同步适配器何时能够赶上这些更改。我想有可能以某种方式强制重新同步。但即使这样,你的应用程序也会停滞不前。您不能仅基于该新日历进行操作并立即使用它。您的应用必须等到同步发生。
您可以为此轮询CalendarContract。让您的应用等待并查看后台线程中的更改,直到新日历显示为止。然后你有它的本地ID并继续前进。
答案 1 :(得分:2)
目前无法使用Clanedar API以编程方式使用Google(Gmail)帐户创建可同步日历。 SyncAdapter可用于创建新的非Gmail帐户并在其中创建新日历,但这些日历无法与Google日历同步。