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

