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

Android 8及以上系统无需Intent如何批量添加日历事件

问题排查与解决方案
  • 首先排查运行时权限
    Android 10 系统中,日历读写属于危险权限,仅在AndroidManifest.xml中声明android.permission.WRITE_CALENDAR、android.permission.READ_CALENDAR权限无效,必须在调用添加事件逻辑前主动触发动态权限申请,用户同意后才能正常操作日历数据库。
    你可以在cr.insert后加判空逻辑,如果返回的uri为null,90%的情况是权限未获取导致写入失败。

  • 不要硬编码日历ID
    你代码中直接写死calID = 3是错误的,不同设备、不同账户下的日历ID完全不同,ID为3的日历可能是无效账户、已删除账户或者默认不显示的同步账户,写入这类日历的事件自然不会在日历APP中展示。
    你需要先查询系统中可用的可写日历ID,示例查询代码:

private long getValidCalendarId() {
    String[] projection = new String[]{CalendarContract.Calendars._ID};
    String selection = CalendarContract.Calendars.VISIBLE + " = 1 AND " + CalendarContract.Calendars.IS_PRIMARY + " = 1";
    Cursor cursor = getActivity().getContentResolver().query(CalendarContract.Calendars.CONTENT_URI, projection, selection, null, null);
    if (cursor != null && cursor.moveToFirst()) {
        long id = cursor.getLong(0);
        cursor.close();
        return id;
    }
    return -1;
}

调用这个方法获取有效ID后再写入,如果返回-1说明没有可用的主日历,需要引导用户先添加日历账户。

  • 补充必要的事件显示参数
    你当前漏了两个控制事件显示的参数,需要添加到ContentValues中:
// 事件可见
values.put(CalendarContract.Events.VISIBLE, 1);
// 允许同步展示
values.put(CalendarContract.Events.SYNC_EVENTS, 1);
  • 注意Calendar月份的计数规则
    Java的Calendar类月份从0开始计数,你代码中set(2021, 10, 22)实际对应的是2021年11月22日,如果你的预期是添加10月的事件,需要把月份参数改为9,否则事件会被写入到11月,你可以先去11月的对应日期排查是否已经有写入成功的事件。

  • 批量添加优化建议
    如果后续要批量添加事件,不要循环调用insert方法,建议使用ContentResolver.applyBatch批量提交操作,不仅执行效率更高,还能保证操作的原子性,避免部分插入成功部分失败的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:15:03