С помощью моего приложения я создаю события календаря, используя 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)
}