Android 以编程方式将事件添加到日历

Android 以编程方式将事件添加到日历,android,events,calendar,android-contentresolver,Android,Events,Calendar,Android Contentresolver,我开发活动经理。存在具有开始和结束日期/时间的事件。 我需要实现将我的应用内事件插入android日历的机会 以下是我编写的代码: val startMillis: Long = 1555406400000 val endMillis: Long = 1555499400000 val name = "Event" val description = "Awesome event" val allDay = false val values = Cont

我开发活动经理。存在具有开始和结束日期/时间的事件。 我需要实现将我的应用内事件插入android日历的机会

以下是我编写的代码:

val startMillis: Long = 1555406400000
    val endMillis: Long = 1555499400000
    val name = "Event"
    val description = "Awesome event"
    val allDay = false

    val values = ContentValues().apply {
      put(CalendarContract.Events.DTSTART, startMillis)
      put(CalendarContract.Events.DTEND, endMillis)
      put(CalendarContract.Events.TITLE, name)
      put(CalendarContract.Events.DESCRIPTION, description)
      put(CalendarContract.Events.ALL_DAY, allDay)
      put(CalendarContract.Events.CALENDAR_ID, 3) //Don't know why `3`, just copied from some example from inthernet
      put(CalendarContract.Events.EVENT_TIMEZONE, ZonedDateTime.now().zone.id)
    }

    val contentUri = CalendarContract.Events.CONTENT_URI
    activity.contentResolver.insert(contentUri, values)
这段代码在安卓5.0设备(事件显示在日历应用程序中)上运行良好,但在7.0设备上不起作用<已授予代码>写入日历和
读取日历
权限


我的代码怎么了?为什么它不能在Android 7.0上运行?

我建议继续使用Android的官方方式,因为不需要权限检查

随后:

val startMillis: Long = Calendar.getInstance().run {
    set(2012, 0, 19, 7, 30)
    timeInMillis
}
val endMillis: Long = Calendar.getInstance().run {
    set(2012, 0, 19, 8, 30)
    timeInMillis
}
val intent = Intent(Intent.ACTION_INSERT)
        .setData(CalendarContract.Events.CONTENT_URI)
        .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startMillis)
        .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endMillis)
        .putExtra(CalendarContract.Events.TITLE, "Yoga")
        .putExtra(CalendarContract.Events.DESCRIPTION, "Group class")
        .putExtra(CalendarContract.Events.EVENT_LOCATION, "The gym")
        .putExtra(CalendarContract.Events.AVAILABILITY, CalendarContract.Events.AVAILABILITY_BUSY)
        .putExtra(Intent.EXTRA_EMAIL, "rowan@example.com,trevor@example.com")
startActivity(intent)

我建议继续使用Android的官方方式,因为不需要权限检查

随后:

val startMillis: Long = Calendar.getInstance().run {
    set(2012, 0, 19, 7, 30)
    timeInMillis
}
val endMillis: Long = Calendar.getInstance().run {
    set(2012, 0, 19, 8, 30)
    timeInMillis
}
val intent = Intent(Intent.ACTION_INSERT)
        .setData(CalendarContract.Events.CONTENT_URI)
        .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startMillis)
        .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endMillis)
        .putExtra(CalendarContract.Events.TITLE, "Yoga")
        .putExtra(CalendarContract.Events.DESCRIPTION, "Group class")
        .putExtra(CalendarContract.Events.EVENT_LOCATION, "The gym")
        .putExtra(CalendarContract.Events.AVAILABILITY, CalendarContract.Events.AVAILABILITY_BUSY)
        .putExtra(Intent.EXTRA_EMAIL, "rowan@example.com,trevor@example.com")
startActivity(intent)

在android 7上,您必须在运行时请求日历权限,而不仅仅是在清单中定义的权限。看看这个答案:@JoachimHaglund我知道。确保在运行此代码时授予权限。在android 7上,您必须在运行时请求日历权限,而不仅仅是在清单中定义的权限。看看这个答案:@JoachimHaglund我知道。确保在运行此代码时授予权限。