【问题标题】:how to get event of calendar in kotlin?如何在 kotlin 中获取日历事件?
【发布时间】:2021-11-01 13:41:50
【问题描述】:

如何获取我添加到 kotlin 日历中的日历事件? 我想打算日历然后当我们回来然后从日历中获取事件并将其展示给我们,我们该怎么做?

这就是我对日历的意图:


private fun addEventOnCalendar(jdn: Jdn) {
        val activity = this ?: return
        if (ActivityCompat.checkSelfPermission(
                activity,
                Manifest.permission.READ_CALENDAR
            ) != PackageManager.PERMISSION_GRANTED
        )
            activity.askForCalendarPermission()
        else {
            runCatching { addEvent.launch(jdn) }.onFailure(logException).onFailure {

            }
        }
    }


    private val addEvent =
        registerForActivityResult(object : ActivityResultContract<Jdn, Void?>() {
            override fun parseResult(resultCode: Int, intent: Intent?): Void? = null
            override fun createIntent(context: Context, input: Jdn): Intent {
                val time = input.toJavaCalendar().timeInMillis
                return Intent(Intent.ACTION_INSERT)
                    .setData(CalendarContract.Events.CONTENT_URI)
                    .putExtra(CalendarContract.Events.DESCRIPTION, "DESCRIPTION")
                    .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, time)
                    .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, time)
                    .putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, true)
            }
        }) {

        }

【问题讨论】:

    标签: android kotlin calendar


    【解决方案1】:

    终于找到了解决办法:

    @SuppressLint("LongLogTag")
      fun readDeviceEvents(
        context: Context, startingDate: Calendar, rangeInMillis: Long
    ): List<Event> = if (
        ActivityCompat.checkSelfPermission(
            context, Manifest.permission.READ_CALENDAR
        ) != PackageManager.PERMISSION_GRANTED
    ) emptyList() else runCatching {
         context.contentResolver.query(
            CalendarContract.Instances.CONTENT_URI.buildUpon().apply {
                ContentUris.appendId(this, startingDate.timeInMillis - DateUtils.DAY_IN_MILLIS)
                ContentUris.appendId(
                    this,
                    startingDate.timeInMillis + rangeInMillis + DateUtils.DAY_IN_MILLIS
                )
            }.build(), arrayOf(
                CalendarContract.Instances.EVENT_ID, // 0
                CalendarContract.Instances.TITLE, // 1
                CalendarContract.Instances.DESCRIPTION, // 2
                CalendarContract.Instances.BEGIN, // 3
                CalendarContract.Instances.END, // 4
                CalendarContract.Instances.VISIBLE, // 5
                CalendarContract.Instances.ALL_DAY, // 6
                CalendarContract.Instances.EVENT_COLOR // 7
            ), null, null, null
        )?.use {
            Log.i(TAG, "readDeviceEvents use cursor: ")
            generateSequence { if (it.moveToNext()) it else null }.filter {
                Log.i(TAG, "readDeviceEvents filter cursor: ")
                it.getString(5) == "1" // is visible
            }.map {
                Log.i(TAG, "readDeviceEvents map cursor: ")
                val id = it.getInt(0)
                val startDate = Date(it.getLong(3))
                val endDate = Date(it.getLong(4))
                val description = it.getString(2)
                val title = if (it.getString(6) == "1") "\uD83D\uDCC5 ${it.getString(1) ?: ""}"
                else "\uD83D\uDD53 ${it.getString(1) ?: ""} "
                val startCalendar = startDate
                val endCalendar = endDate
    
                Log.i(TAG, "readDeviceEvents id: " + id)
                Log.i(TAG, "readDeviceEvents startDate: " + startDate)
                Log.i(TAG, "readDeviceEvents endDate: " + endDate)
                Log.i(TAG, "readDeviceEvents startCalendar: " + startCalendar)
                Log.i(TAG, "readDeviceEvents endCalendar: " + endCalendar)
                Log.i(TAG, "readDeviceEvents description: " + description)
                Log.i(TAG, "readDeviceEvents title: " + title)
    
                Event(id=id.toLong(),title= title,desc= description)
    
            }.take(1000 /* let's put some limitation */).toList()
        }
    }.onFailure(logException).getOrNull() ?: emptyList()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-18
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多