Foros 3: Как получить обновления о событиях календаря для индивидуального осложнения?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Foros 3: Как получить обновления о событиях календаря для индивидуального осложнения?

Сообщение Anonymous »

Я пытаюсь создать индивидуальное осложнение Foros, которое показывает название следующего события. На часах есть встроенное приложение повестки дня, которое синхронизируется с календарем телефона. Существует также встроенное осложнение, которое показывает время следующего события из того же приложения повестки дня. Когда я меняю следующее событие в своем телефоне (время и заголовок), сразу же обновляются осложнения (это занимает 5-10 секунд), а новая информация также доступна в приложении повестки дня часов. Я хочу, чтобы мое осложнение делало то же самое, но оно просто не обновляется.

Код: Выделить всё

class ComingEventComplication : SuspendingComplicationDataSourceService() {

override suspend fun onComplicationRequest(request: ComplicationRequest): ComplicationData? {
val nextEvent = getNextCalendarEvents(this.contentResolver)[0]

return if (nextEvent != null) {
//Expose data to the complication
} else {
//Show a placeholder
}
}

//Preview data
override fun getPreviewData(type: ComplicationType): ComplicationData? {
[...]
}
}
< /code>
Я не показываю код, чтобы разоблачить данные, чтобы сделать его короче (но это работает).  Функция getNextCalendARevents () 
является следующим:

Код: Выделить всё

fun getNextCalendarEvents(contentResolver: ContentResolver): List {
val events = mutableListOf()

// Define the projection (columns you want to retrieve)
val projection = arrayOf(
CalendarContract.Instances.EVENT_ID,
CalendarContract.Instances.TITLE,
CalendarContract.Instances.DESCRIPTION,
CalendarContract.Instances.EVENT_LOCATION,
CalendarContract.Instances.BEGIN,
CalendarContract.Instances.END,
CalendarContract.Instances.ALL_DAY
)

val startMillis = System.currentTimeMillis()
val endMillis = startMillis + TimeUnit.DAYS.toMillis(5)

val uriBuilder = WearableCalendarContract.Instances.CONTENT_URI.buildUpon()
ContentUris.appendId(uriBuilder, startMillis)
ContentUris.appendId(uriBuilder, endMillis)
val uri = uriBuilder.build()

// Query the Content Provider
val cursor = contentResolver.query(
uri,
projection,
null,
null,
null
)

cursor?.use {
while (it.moveToNext()) {
val eventId = it.getLong(it.getColumnIndexOrThrow(CalendarContract.Instances.EVENT_ID))
val title = it.getString(it.getColumnIndexOrThrow(CalendarContract.Instances.TITLE))
val description =
it.getString(it.getColumnIndexOrThrow(CalendarContract.Instances.DESCRIPTION))
val location =
it.getString(it.getColumnIndexOrThrow(CalendarContract.Instances.EVENT_LOCATION))
val beginTime = it.getLong(it.getColumnIndexOrThrow(CalendarContract.Instances.BEGIN))
val endTime = it.getLong(it.getColumnIndexOrThrow(CalendarContract.Instances.END))
val isAllDay =
it.getInt(it.getColumnIndexOrThrow(CalendarContract.Instances.ALL_DAY)) == 1

events.add(
CalendarEvent(
id = eventId,
title = title,
description = description,
location = location,
startTime = Instant.ofEpochMilli(beginTime),
endTime = Instant.ofEpochMilli(endTime),
isAllDay = isAllDay
)
)
}
}

return events.sortedBy { it.startTime }
}
< /code>
С помощью моего пользовательского класса данных: < /p>
data class CalendarEvent(
val title: String,
val startTime: Instant,
val endTime: Instant,
val isAllDay: Boolean,
val description: String?,
val location: String?,
val id: Long
)
Наконец, мой AndroidManifest настройка:

Код: Выделить всё














< /code>
Эта часть работает, как и ожидалось: я добавляю осложнение и показывает имя следующего события в моем календаре. Проблема возникает, когда я меняю следующее событие в своем календаре на своем телефоне.  Встроенные обновления осложнений, но не мои (я должен снова его заново добавить). До сих пор я пытался добавить workmanager 
для обновления усложнения (что не очень надежно, если вы устанавливаете его для планирования каждую долгое время, и в противном случае он может сливать батарею) и используя ContentObserver :

Код: Выделить всё

class ContentObserver(
private val context: Context,
private val componentName: ComponentName
) : ContentObserver(Handler(Looper.getMainLooper())) {

override fun onChange(selfChange: Boolean, uri: Uri?) {
super.onChange(selfChange, uri)
Log.d("DEBUG_", "onChange: Changed!")
requestComplicationUpdate()
}

private fun requestComplicationUpdate() {
val requester = ComplicationDataSourceUpdateRequester.create(
context = context,
complicationDataSourceComponent = componentName
)
requester.requestUpdateAll()
}
}
Я делаю регистрацию моего contenobserver InsideeVentComplication Class:

Код: Выделить всё

override fun onCreate() {
super.onCreate()
val calendarUri: Uri = WearableCalendarContract.CONTENT_URI

// Create the ContentObserver instance.
calendarObserver = ContentObserver(
context = applicationContext,
componentName = ComponentName(applicationContext, ComingEventComplication::class.java)
)

// Register the observer.
contentResolver.registerContentObserver(
calendarUri,
true,
calendarObserver
)
}

override fun onDestroy() {
super.onDestroy()
// Unregister the observer to prevent memory leaks.
contentResolver.unregisterContentObserver(calendarObserver)
}
Debug_ Onchange: изменен! никогда не отображается в моем logcat. Я также попытался добавить приемник в свой манифест: < /p> Настройка Android: host в качестве URI , данного с помощью forablecalendarContract.content_uri , forablecalendarContract.instances.content_uri и calendarContract.content_uri . Получатель вызывает фиктивную веропродолжение , который отображает запись журнала. Я не имел успеха ни с кем из них. Я проверил сторонние осложнения, которые могут обновляться менее чем через минуту после изменения события по телефону, поэтому я думаю, что должен быть надежный способ сделать это. Любая помощь будет оценена!

Подробнее здесь: https://stackoverflow.com/questions/797 ... mplication
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»