通过内容解析器添加日历事件后,需要记录时间才能与谷歌日历同步

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)