安卓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
相关产品推荐
相关产品推荐

