对于最近的应用程序,我希望提供在 Android 设备上订阅日历源的功能。无法访问 calendar.google.com 并手动添加 http 链接 (ics)。我真的找不到关于这个主题的很多信息。由于它是一个全新的应用程序,因此不必是 ics。只要能在 iOS 和 Android 上正常工作即可。
在 iOS 上,这非常简单,因为您只需以编程方式使用 .ics 链接进行调用,用户就会收到一个要订阅的问题。 Android ICS 还引入了日历 API,但我还没有真正找到任何关于如何使用它订阅公共 ICS 的线索。我认为这是不可能的,因为这似乎是一种实际制作新日历或添加/更改事件但不订阅不断变化的 .ics 提要的方法。
无论如何,我只是想确定这是真的,而不是一个选择。 (我认为这是2014年Android的缺陷。)
还有一个关于 SO 的问题 相关,由 CommonsWare 提供答案。但是让用户与我的应用程序一起安装另一个应用程序并不是一种选择,而且太麻烦了。只有某种可以进行订阅的库才能真正使此过程可以在应用程序中使用。
BroadcastReceiver
s(侦听器)完成,而能够将数据公开给其他应用程序的所有内容都是
ContentProvider
s(基本上是公共 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("[email protected]", "com.example", "[email protected]")
val cur: Cursor = contentResolver.query(uri, EVENT_PROJECTION, selection, selectionArgs, null)
}
}
因此存在一些限制:
BroadcastReceiver
中的意图没有额外的内容,因此为了知道发生了什么变化,您必须每次都查询日历
ContentProvider
。至少我上次尝试时是这样的。
官方文档。
希望有帮助。