mat*_*tip 5 android android-contentresolver android-calendar
通过我的应用程序,我使用创建日历事件ContentResolver。活动已成功创建,您可以在系统日历应用程序中看到它们。当用户使用 Google 日历应用程序时会出现问题。有时,事件需要几分钟的时间才会出现。此外,当该事件最终出现在 Google 日历中并且用户将其删除时,它仍然会在系统日历中再次可见几分钟。
在我的应用程序中,我想创建在 caledndar 中打开新创建的事件的意图,但由于该同步问题,它没有被显示,因为它还不可见。另外,在创建新事件之前,我会检查它是否已经存在,并且由于同步,它似乎没有被删除,并且我没有在应该创建新事件时创建新事件。
这是我创建事件的方式:
fun addEventToCalendar(context: Context,
title: String,
description: String?,
startDateMillis: Long,
endDateInMillis: Long,
tag: String): Long? {
val timeZone = TimeZone.getDefault()
val values = ContentValues().apply {
put(CalendarContract.Events.DTSTART, startDateMillis)
put(CalendarContract.Events.DTEND, endDateInMillis)
put(CalendarContract.Events.TITLE, title)
description?.let { put(CalendarContract.Events.DESCRIPTION, description) }
put(CalendarContract.Events.EVENT_TIMEZONE, timeZone.id)
put(CalendarContract.Events.CALENDAR_ID, getCalendarId(context))
put(CalendarContract.Events.UID_2445, tag)
}
val uri = context.contentResolver.insert(CalendarContract.Events.CONTENT_URI, values)
return uri?.lastPathSegment?.toLong()
}
fun checkIfEventAlreadyExist(context: Context, tag: String): Long? {
val projection = arrayOf(CalendarContract.Events._ID, CalendarContract.Events.DTSTART, CalendarContract.Events.DTEND, CalendarContract.Events.UID_2445)
val cursor = context.contentResolver.query(
CalendarContract.Events.CONTENT_URI,
projection,
"$CalendarContract.Events.UID_2445 = ? and $CalendarContract.Events.CALENDAR_ID = ?",
arrayOf(tag, getCalendarId(context).toString()),
"$CalendarContract.Events._ID ASC")
cursor?.let {
cursor.moveToFirst()
val eventId = if (cursor.count == 0) null else cursor.getLong(0)
cursor.close()
return eventId
}
return null
}
Run Code Online (Sandbox Code Playgroud)
我还注意到,当我通过系统日历应用程序或谷歌日历应用程序正常添加事件时,没有问题。所有事件都会立即显示在各处,删除也是如此。
我如何改进谷歌日历同步?
编辑:
在我的研究过程中,我收到了ContentResolver.requestSync()添加日历事件后使用的建议。它看起来很有希望,但不起作用......我在这里做错了什么吗?这是我的代码:
private fun forceSync(context: Context) {
val extras = Bundle()
extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true)
extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
val account = Account("example.email@gmail.com", "com.google")
ContentResolver.requestSync(account, CalendarContract.AUTHORITY, extras)
}
Run Code Online (Sandbox Code Playgroud)
或者:
private fun forceSync(context: Context) {
val cr = context.contentResolver
val values = ContentValues()
values.put(CalendarContract.Calendars.SYNC_EVENTS, 1)
values.put(CalendarContract.Calendars.VISIBLE, 1)
cr.update(
ContentUris.withAppendedId(CalendarContract.Calendars.CONTENT_URI,
3), values, null, null)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
929 次 |
| 最近记录: |