项目场景:
在项目开发过程中,需要使用系统日历来辅助提醒。通过向系统日历中写入事件、设置提醒方式,实现到达某个特定的时间自动提醒的功能
解决方案:
1. 请求权限
//Android6.0以上需要动态申请权限
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
2. 创建一个常量类添加日历相关的uri
const val CONSTANT_CALENDAR_URL = "content://com.android.calendar/calendars" // 日历账户
const val CONSTANT_CALENDAR_EVENT_URL = "content://com.android.calendar/events" // 日历事件
const val CONSTANT_CALENDAR_REMINDER_URL = "content://com.android.calendar/reminders" // 日历提醒
3.创建一个日历的工具类
import android.content.ContentUris
import android.content.Context
import android.database.Cursor
import android.graphics.Color
import android.net.Uri
import android.provider.CalendarContract
import android.util.Log
import androidx.core.content.contentValuesOf
import com.list.plan.constant.*
import com.list.plan.entity.PunchEntity
import java.util.*
/**
* 日历提醒工具类
*/
class CalendarReminderUtils {
/**
* 检查是否已经添加了日历账户,如果没有先添加一个日历账户再查询
* 获取账户成功返回账户id,否则返回-1
*/
private fun checkAndAddCalendarAccount(context: Context): Int {
var account = -1
account = getSystemCalendarAccount(context)
return if (account < 0) {
addCalendarAccount(context)
} else account
}
/**
* 检查是否存在现有账户,存在则返回账户id,否则返回-1
* 这里获取现有账户中第一个账号,如果不需要,可以将CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL + " ASC "变成null
*/
private fun getSystemCalendarAccount(context: Context): Int {
var account = -1
var userCursor: Cursor? = null
try {
if (android