You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

安卓Kotlin中谷歌日历事件添加问题及指定日历方法咨询

安卓Kotlin日历事件问题解答

一、事件被添加到设置日期一个月后的原因

这是因为Calendar类的月份参数是0-based索引:0代表1月,1代表2月,以此类推,3实际对应4月。你代码里设置的2024, 3, 27会被解析为2024年4月27日,所以看起来像是晚了一个月。

修改方法是使用Calendar类提供的月份常量,或者直接传入对应月份的索引(比如三月对应索引2):

val startMillis: Long = Calendar.getInstance().run {
    // 使用Calendar.MARCH表示三月,或直接写2
    set(2024, Calendar.MARCH, 27, 16, 45)
    timeInMillis
}
val endMillis: Long = Calendar.getInstance().run {
    set(2024, Calendar.MARCH, 27, 16, 50)
    timeInMillis
}

二、关于getCalendarId函数的疑问解答

1. 能否找到用户默认日历或谷歌日历?

可以。函数的逻辑是:

  • 优先查询**可见且标记为默认(IS_PRIMARY=1)**的日历,这通常就是用户设置的默认日历,而谷歌日历在多数设备上会被设为默认日历。
  • 如果没有找到默认日历,就返回第一个可见的日历。
    只要谷歌日历处于可见状态,要么是默认日历,要么是第一个可见日历,就能被该函数找到。

2. 当前函数能否指定要添加事件的日历?

不能。当前函数只会返回第一个符合条件的日历ID,无法指定特定的日历(比如用户的工作日历、家庭日历等)。

3. 如何实现将事件添加到特定日历?

有两种常用实现方式:

方式一:通过日历名称/账户名过滤查询ID

修改函数,添加参数指定目标日历的名称或账户,比如按名称查找谷歌日历:

private fun getSpecificCalendarId(context: Context, targetCalendarName: String) : Long? {
    val projection = arrayOf(CalendarContract.Calendars._ID, CalendarContract.Calendars.CALENDAR_DISPLAY_NAME)
    val selection = "${CalendarContract.Calendars.VISIBLE} = 1 AND ${CalendarContract.Calendars.CALENDAR_DISPLAY_NAME} = ?"
    val selectionArgs = arrayOf(targetCalendarName)

    context.contentResolver.query(
        CalendarContract.Calendars.CONTENT_URI,
        projection,
        selection,
        selectionArgs,
        null
    )?.use { cursor ->
        if (cursor.moveToFirst()) {
            val idCol = cursor.getColumnIndex(projection[0])
            return cursor.getString(idCol).toLong()
        }
    }
    return null
}

调用时传入设备上显示的日历名称即可,比如getSpecificCalendarId(context, "Google 日历")。

方式二:让用户选择目标日历

先查询所有可见日历,展示给用户选择后获取对应ID:

// 获取所有可见日历的ID和名称列表
private fun getAllVisibleCalendars(context: Context): List<Pair<Long, String>> {
    val calendars = mutableListOf<Pair<Long, String>>()
    val projection = arrayOf(CalendarContract.Calendars._ID, CalendarContract.Calendars.CALENDAR_DISPLAY_NAME)
    val selection = "${CalendarContract.Calendars.VISIBLE} = 1"

    context.contentResolver.query(
        CalendarContract.Calendars.CONTENT_URI,
        projection,
        selection,
        null,
        null
    )?.use { cursor ->
        val idCol = cursor.getColumnIndex(projection[0])
        val nameCol = cursor.getColumnIndex(projection[1])
        while (cursor.moveToNext()) {
            val id = cursor.getString(idCol).toLong()
            val name = cursor.getString(nameCol)
            calendars.add(id to name)
        }
    }
    return calendars
}

可以将这个列表展示在Spinner或Dialog中,用户选择后,用选中的ID添加事件即可。

内容的提问来源于stack exchange,提问作者Anusha C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:08:33