如何在 kotlin (android) 中的谷歌日历中添加事件?

问题描述 投票:0回答:1
val calID: Long? = getCalendarId(context)
                            val startMillis: Long = Calendar.getInstance().run {
                                set(2024, 3, 27, 16, 45)
                                timeInMillis
                            }
                            val endMillis: Long = Calendar.getInstance().run {
                                set(2024, 3, 27, 16, 50)
                                timeInMillis
                            }
 
                            val values = ContentValues().apply {
                                put(CalendarContract.Events.DTSTART, startMillis)
                                put(CalendarContract.Events.DTEND, endMillis)
                                put(CalendarContract.Events.TITLE, "gym")
                                put(CalendarContract.Events.DESCRIPTION, "Group workout")
                                put(CalendarContract.Events.CALENDAR_ID, calID)
                                put(CalendarContract.Events.EVENT_TIMEZONE, "Asia/Kolkata")
                            }
                            Log.d("Calendar", "Event values: $values")
 
                            val uri: Uri? = context.contentResolver.insert(CalendarContract.Events.CONTENT_URI, values)
                            Log.d("Calendar", "Event URI: $uri")
 
                            val eventID: Long = uri?.lastPathSegment?.toLong() ?: 0

在上面的代码中,当我添加日期时。它将在该日期一个月后添加该事件。为什么会有这样的表现?

private fun getCalendarId(context: Context) : Long? {
    val projection = arrayOf(CalendarContract.Calendars._ID, CalendarContract.Calendars.CALENDAR_DISPLAY_NAME)
 
    var calCursor = context.contentResolver.query(
        CalendarContract.Calendars.CONTENT_URI,
        projection,
        CalendarContract.Calendars.VISIBLE + " = 1 AND " + CalendarContract.Calendars.IS_PRIMARY + "=1",
        null,
        CalendarContract.Calendars._ID + " ASC"
    )
 
    if (calCursor != null && calCursor.count <= 0) {
        calCursor = context.contentResolver.query(
            CalendarContract.Calendars.CONTENT_URI,
            projection,
            CalendarContract.Calendars.VISIBLE + " = 1",
            null,
            CalendarContract.Calendars._ID + " ASC"
        )
    }
 
    if (calCursor != null) {
        if (calCursor.moveToFirst()) {
            val calName: String
            val calID: String
            val nameCol = calCursor.getColumnIndex(projection[1])
            val idCol = calCursor.getColumnIndex(projection[0])
 
            calName = calCursor.getString(nameCol)
            calID = calCursor.getString(idCol)
 
         
 
            calCursor.close()
            return calID.toLong()
        }
    }
    return null
}

我可以使用此代码找到用户或 Google 日历选择的默认日历吗?我可以指定要添加活动的日历吗?

我想将事件添加到手机上的特定日历中。我怎样才能做到这一点?

android kotlin calendar android-jetpack-compose google-calendar-api
1个回答
0
投票

日期差异的问题可能与您在日历实例中设置月份的方式有关。在 Java 的 Calendar 类中,月份是从零开始的,这意味着一月表示为 0,二月表示为 1,依此类推。因此,当您将月份设置为 3 时,它实际上代表四月,而不是您想象的三月。

要解决此问题,您应该在设置日期时从月份中减去 1:

val startMillis: Long = Calendar.getInstance().run {
    set(2024, 2, 27, 16, 45) // March (2), 27th
    timeInMillis
}

val endMillis: Long = Calendar.getInstance().run {
    set(2024, 2, 27, 16, 50) // March (2), 27th
    timeInMillis
}

关于指定要添加事件的日历,您的 getCalendarId() 函数会尝试查找主日历 (IS_PRIMARY) 并返回其 ID。对于主日历通常是默认日历的许多设备来说,这应该可以正常工作。但是,不能保证它适用于所有设备,因为行为可能会因安装的日历应用程序及其配置而异。

如果要将事件添加到特定日历,可以修改 getCalendarId() 函数以返回该特定日历的 ID。您可以通过根据某些条件(例如日历名称或帐户名称)查询日历来实现此目的。这是一个例子:

private fun getCalendarId(context: Context, calendarName: String): Long? {
    val projection = arrayOf(CalendarContract.Calendars._ID, CalendarContract.Calendars.CALENDAR_DISPLAY_NAME)

    val selection = "${CalendarContract.Calendars.CALENDAR_DISPLAY_NAME} = ?"
    val selectionArgs = arrayOf(calendarName)

    context.contentResolver.query(
        CalendarContract.Calendars.CONTENT_URI,
        projection,
        selection,
        selectionArgs,
        null
    )?.use { cursor ->
        if (cursor.moveToFirst()) {
            return cursor.getLong(cursor.getColumnIndex(CalendarContract.Calendars._ID))
        }
    }

    return null
}

然后,当您要添加事件时,可以将所需的日历名称传递给此函数以获取 ID,并在将事件插入日历时使用该 ID:

val calendarName = "My Calendar"
val calID: Long? = getCalendarId(context, calendarName)

这将确保将事件添加到指定的日历中。确保处理找不到指定日历或函数返回 null 的情况。

© www.soinside.com 2019 - 2024. All rights reserved.