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