После добавления события календаря через распознаватель контента требуется время для синхронизации, чтобы синхронизировать c с календарем Google. - PullRequest
2 голосов
/ 01 марта 2020

С помощью моего приложения я создаю события календаря, используя ContentResolver. События успешно создаются, и вы можете увидеть их в приложении системного календаря. Проблемы появляются, когда пользователь использует приложение Google Calendar. Иногда для появления события там требуется несколько минут. Кроме того, когда событие, наконец, появляется в Календаре Google и пользователь удаляет его там, оно все еще отображается в системном календаре снова на несколько минут.

В моем приложении я хочу создать намерение открыть вновь созданное событие в caledndar, но потому что этой проблемы синхронизации он не отображается, так как он еще не виден. Также перед созданием нового события я проверяю, существует ли оно уже, и снова из-за синхронизации выясняется, что оно не было удалено, и я не создаю новое, когда должно быть.

Вот как я создаю events:

     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
    }

Также я заметил, что когда я обычно добавляю событие через приложение системного календаря или приложение google calendar, проблем не возникает. Все события сразу отображаются везде, и то же самое относится и к удалению.

Как улучшить синхронизацию календаря Google?

РЕДАКТИРОВАТЬ: Во время исследования я пришел Вы можете использовать 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)
    }

или:

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)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...