Webcal/.ics订阅Android应用内的Feed

Jor*_*rdy 14 icalendar android calendar feed subscribe

对于最近的应用程序,我希望能够在停留在Android设备上时订阅日历源.转到calendar.google.com并手动添加http链接(ics)不是一个选项.我真的找不到关于这个主题的很多信息.由于它是一个全新的应用程序,它不一定是ics.任何在iOS Android 上运行正常的东西.

在iOS上,这很容易,因为您可以通过编程方式使用.ics链接进行调用,用户将获得一个要订阅的问题.Android ICS还引入了Calendar API,但我还没有找到任何关于如何使用它来订阅公共媒体的线索.我不认为这是可能的,因为它似乎只是一种实际制作新日历或添加/更改事件但不订阅更改.ics提要的方式.

无论如何,我只是想确定这是真的,而不是一个选择.(在我看来,这是2014年Android的一个缺陷.)

对SO另一个问题是相关的,通过CommonsWare答案.但是让用户与我的应用程序一起安装另一个应用程序不是一个选项,而且太麻烦了.只有可以进行订阅的某种库才能真正使这个过程在应用程序中使用.

Pav*_*sha 0

因此,Android 中所有可以订阅的内容都应该通过BroadcastReceivers(监听器)来完成,而所有能够将数据暴露给其他应用程序的内容都是ContentProviders(基本上是公共 SQL 数据库)。记住这一点,我们可以尝试这样的事情:

// Adding permissions to the manifest
<uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />


// registering the BroadcasrReceiver in manifest(you can do it also in java/kotlin code):
 <receiver android:name="path.to.some.Receiver">
        <intent-filter>
            <action android:name="android.intent.action.PROVIDER_CHANGED" />
            <data android:scheme="content" />
            <data android:host="com.android.calendar" />
        </intent-filter>
    </receiver>


// Declaring receiver in the code
class Receiver:BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
// Your Code that handles the Calendar ContentProvider query for example:
// Run query
val uri: Uri = CalendarContract.Calendars.CONTENT_URI
val selection: String = "((${CalendarContract.Calendars.ACCOUNT_NAME} = ?) AND (" +
        "${CalendarContract.Calendars.ACCOUNT_TYPE} = ?) AND (" +
        "${CalendarContract.Calendars.OWNER_ACCOUNT} = ?))"
val selectionArgs: Array<String> = arrayOf("hera@example.com", "com.example", "hera@example.com")
val cur: Cursor = contentResolver.query(uri, EVENT_PROJECTION, selection, selectionArgs, null)
}
}    
Run Code Online (Sandbox Code Playgroud)

但也有一些限制:

  1. 在某些设备上(尤其是高度定制的 ROM),此广播可能会被破坏 - 它会触发,但不是每次更改时都会触发 - 因此,如果您想要一致性,您可能必须对日历中的数据设置一些间隔轮询。
  2. 中的意图BroadcastReceiver没有额外的内容,因此为了了解发生了什么变化,您必须ContentProvider每次都查询日历。至少我上次尝试时是这样的。

使用此 API,您还可以创建活动、邀请与会者以及使用日历执行任何基本操作 - 有关详细信息,请参阅官方文档

关于 Webcal,Google 日历应用程序对 Webcal 协议的支持有限。更改最多可能需要 24 小时才能生效,并且不保证一定会发生。另外,关于Android——我认为应用程序内部根本不支持它——至少谷歌本身不支持。我听说过 Android 的日历应用程序确实支持它 - 从未使用过这些应用程序,所以我不知道实现的细节 - 我假设它们通过自己的后端工作并使用 Webcal 协议进行中间获取和缓存数据的变化 - 为了仓促 - 所以绝对没有使用 Android 原生方法。

希望能帮助到你。