17

我基本上想重新打开以下未答复的帖子:

我想利用 Android Calendar Provider API 创建日历并将事件插入其中。创建的日历不能是本地副本。它必须与 Google(在线)日历同步。文档说为了做到这一点,我必须使用同步适配器。但是我该如何编写这样的同步适配器呢?

到目前为止,我已经找到了以下两个帖子,但没有解决方案。

我想为此使用 Android Calendar API 而不是 Google API,以便用户可以离线工作。

4

2 回答 2

5

看起来谷歌在这方面搞砸了 CalendarContract。文档对此并不完全清楚:

...插入新日历作为同步适配器完成。

在我看来,这种措辞的方式就像它可能奏效的可能性很小。但实际上(判断您链接的其他 SO 问题)使用 CalendarContract 的应用程序无法创建同步日历。

您真的不想经历创建自己的 SyncAdapter 的所有麻烦。我为我的一个应用程序做了一次,因为我想要一个可靠的解决方案来在冰淇淋三明治设备上同步日历访问(CalendarContract 尚不存在)。

这是很多工作。它涉及与 Google 日历网络服务 API 的接口(同时尊重它们的访问限制),保留数据的本地副本并仅同步差异。最终,您自己的 SyncAdapter 也会复制已经存在的 Google Calendar SyncAdapter 的数据。

您可以做的解决方法是直接在Google Calendar 在线 API上实现必要的“创建日历”功能。它要求您的应用通过android.permission.USE_CREDENTIALS.

AccountManager可用于获取正确的授权令牌以访问 Google 日历 API。该方法getAuthToken需要一个身份验证令牌类型参数。日历读/写访问的正确方法是以下字符串文字:"Manage your calendars".

但是,该解决方法存在两个大问题:

  1. 您无法确定日历同步后端是否使用 Google 日历。不幸的是,这是一个黑匣子。

  2. 您无法确定日历同步适配器何时会赶上这些更改。我想有可能以某种方式强制重新同步。但即便如此,您的应用程序也会停滞不前。您不能只根据该新日历进行操作并立即使用它。您的应用程序必须等到同步发生。

您可以为此轮询 CalendarContract。让您的应用程序等待并在后台线程中查找更改,直到新日历出现。然后你有它的本地ID并继续前进。

于 2013-08-19T21:57:00.437 回答
2

目前无法使用 Clanedar API 以编程方式创建与 Google (Gmail) 帐户同步的日历。SyncAdapter 可用于创建新的非 Gmail 帐户并在那里创建新日历,但这些无法与 Google 日历同步。

更多细节在这里:https ://stackoverflow.com/a/19734278/237232

于 2013-11-01T19:52:53.150 回答