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

如何通过Events URI为Android日历事件程序化添加提醒?

Android日历事件添加自定义提醒的解决方案

嘿,我来帮你搞定这个日历提醒的问题!你已经完成了事件的基础创建,就差实现红圈里的自定义提醒功能对吧?其实核心就是利用CalendarContract.Reminders类来给已创建的事件绑定提醒,下面一步步来帮你补全代码:

第一步:确认权限配置

首先要确保你的应用已经申请了日历相关权限,在AndroidManifest.xml里添加:

<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />

如果是Android 6.0(API 23)及以上版本,还需要动态申请这些权限,你可以在调用添加事件方法前先检查权限:

private boolean checkCalendarPermissions() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR},
                1001);
        return false;
    }
    return true;
}

第二步:补全添加事件并插入提醒的代码

你的addEventToCalendar方法需要先完成事件的插入,拿到事件ID后再插入提醒。下面是完整的示例代码:

public void addEventToCalendar(String eventTitle, String eventDescription, String eventLocation,
                               int startYear, int startMonth, int startDay, int startHour, int startMinute,
                               int endYear, int endMonth, int endDay, int endHour, int endMinute,
                               int reminderMinutes) {
    // 先检查权限
    if (!checkCalendarPermissions()) {
        return;
    }

    ContentResolver cr = getContentResolver();
    ContentValues eventValues = new ContentValues();

    // 设置事件基本信息
    eventValues.put(CalendarContract.Events.TITLE, eventTitle);
    eventValues.put(CalendarContract.Events.DESCRIPTION, eventDescription);
    eventValues.put(CalendarContract.Events.EVENT_LOCATION, eventLocation);
    eventValues.put(CalendarContract.Events.CALENDAR_ID, 1); // 默认日历ID,也可动态获取
    eventValues.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());

    // 设置开始时间
    Calendar startCal = Calendar.getInstance();
    startCal.set(startYear, startMonth - 1, startDay, startHour, startMinute);
    eventValues.put(CalendarContract.Events.DTSTART, startCal.getTimeInMillis());

    // 设置结束时间
    Calendar endCal = Calendar.getInstance();
    endCal.set(endYear, endMonth - 1, endDay, endHour, endMinute);
    eventValues.put(CalendarContract.Events.DTEND, endCal.getTimeInMillis());

    // 插入事件并获取事件ID
    Uri eventUri = cr.insert(CalendarContract.Events.CONTENT_URI, eventValues);
    if (eventUri == null) {
        // 事件插入失败,做错误处理
        Toast.makeText(this, "事件添加失败", Toast.LENGTH_SHORT).show();
        return;
    }
    long eventId = Long.parseLong(eventUri.getLastPathSegment());

    // 插入提醒(这就是你要的红圈功能!)
    ContentValues reminderValues = new ContentValues();
    reminderValues.put(CalendarContract.Reminders.EVENT_ID, eventId);
    reminderValues.put(CalendarContract.Reminders.MINUTES, reminderMinutes); // 提前多少分钟提醒
    reminderValues.put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT); // 弹窗提醒方式

    Uri reminderUri = cr.insert(CalendarContract.Reminders.CONTENT_URI, reminderValues);
    if (reminderUri != null) {
        Toast.makeText(this, "事件和提醒添加成功", Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(this, "提醒添加失败", Toast.LENGTH_SHORT).show();
    }
}

关键细节说明

  • 提醒方式(METHOD):除了METHOD_ALERT(弹窗),还有METHOD_EMAIL(邮件提醒)、METHOD_SMS(短信提醒),不过后两种需要系统支持,日常用METHOD_ALERT就足够。
  • 日历ID:示例里用了默认的1,如果需要让用户选择日历,可以通过查询CalendarContract.Calendars.CONTENT_URI来获取所有可用日历的ID。
  • 时区:一定要设置EVENT_TIMEZONE,否则可能出现时间显示错位的问题。

这样调用addEventToCalendar方法时,传入你想要的提前提醒分钟数(比如提前30分钟就传30),就能实现你图中红圈标注的自定义提醒功能啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:29:38