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 日历选择的默认日历吗?我可以指定要添加活动的日历吗?
我想将事件添加到手机上的特定日历中。我怎样才能做到这一点?
日期差异的问题可能与您在日历实例中设置月份的方式有关。在 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 的情况。