DTEND and DURATION cannot both be null for an event.设置日历日程重复的坑

您所在的位置:网站首页 switch初次设置 DTEND and DURATION cannot both be null for an event.设置日历日程重复的坑

DTEND and DURATION cannot both be null for an event.设置日历日程重复的坑

2023-05-19 14:52| 来源: 网络整理| 查看: 265

CalendarContract日历日程重复的坑

日历中的日程设置了DTEND 后,RRULE循环也打开了,但是循环了一段时间后发现没有了,仅有三个月以内有日程(可能更少)找了半天发现DTEND在循环日程时候需要关闭的,关闭之后会报错 java.lang.IllegalArgumentException: DTEND and DURATION cannot both be null for an event. 在这里插入图片描述 DTEND和DURATION二选一 Events.DURATION 加上这个就好了

event.put(CalendarContract.Events.DURATION, "PT1H");

该PT1H代表时间,而不是绑在时间轴的时间跨度。此格式在ISO 8601标准中定义该标志开始的时候,短期的“期”,为持续的代名词。该T分离任何小时-分-秒部分的任何年,月,日部分,所以PT1H意思是“一个小时”。两个半小时就是PT2H30M。

event.put(Events.RRULE,"FREQ=DAILY;INTERVAL=1;WKST=SU"); //FREQ=DAILY;INTERVAL=1是每天循环,WKST=SU是设置从周日开始

FREQ :表示重复规则的类型, 必须定义 值:HOURLY:小时、DAILY:天、WEEKLY:周、MONTHLY:月、YEARLY:年 INTERVAL :重复间隔数 值:必须为正整数,默认值为1,表示每小时、每天

比如每天重复:FREQ=DAILY;INTERVAL=1;WKST=SU WKST=SU ,表示从周几开始,硬性规定

比如每个周末重复:FREQ=WEEKLY;INTERVAL=1;BYDAY=SA,SU

MO(周一),TU(周二),WE(周三),TU(周四),FR(周五),SA(周六),SU(周日)

CalendarEvent

import android.annotation.SuppressLint; import android.content.ContentValues; import android.database.Cursor; import android.graphics.Color; import android.net.Uri; import android.provider.CalendarContract; import android.provider.CalendarContract.Attendees; import android.provider.CalendarContract.Calendars; import android.provider.CalendarContract.Events; import android.provider.CalendarContract.Reminders; import android.text.TextUtils; import java.util.ArrayList; import java.util.List; import java.util.TimeZone; /** * @author Xq * @date 2021/01/10 */ public class CalendarEvent { private static final String ACCOUNT_NAME = Constants.ACCOUNT_NAME; /** * 使用以下Uri时,Android版本>=14; 注意引用包路径:android.provider.CalendarContract下的; **/ private static Uri calendarsUri = Calendars.CONTENT_URI; private static Uri eventsUri = Events.CONTENT_URI; private static Uri remindersUri = Reminders.CONTENT_URI; private static Uri attendeesUri = Attendees.CONTENT_URI; /** * Events table columns */ public static final String[] EVENTS_COLUMNS = new String[]{Events._ID, Events.CALENDAR_ID, Events.TITLE, Events.DESCRIPTION, Events.EVENT_LOCATION, Events.DTSTART, Events.DTEND, Events.EVENT_TIMEZONE, Events.HAS_ALARM, Events.ALL_DAY, Events.AVAILABILITY, Events.ACCESS_LEVEL, Events.STATUS,}; /** * Reminders table columns */ public static final String[] REMINDERS_COLUMNS = new String[]{ Reminders._ID, Reminders.EVENT_ID, Reminders.MINUTES, Reminders.METHOD,}; /** * Attendees table columns */ public static final String[] ATTENDEES_COLUMNS = new String[]{ Attendees._ID, Attendees.ATTENDEE_NAME, Attendees.ATTENDEE_EMAIL, Attendees.ATTENDEE_STATUS}; /** * 插入事件 */ public static void insertEvent(EventModel model) { String calId = queryCalId(); if (TextUtils.isEmpty(calId)) { addAccount(); insertEvent(model); return; } // 插入事件 ContentValues event = new ContentValues(); event.put(Events.TITLE, model.getTitle());//标题 event.put(Events.DESCRIPTION, model.getContent());//备注 event.put(Events.EVENT_LOCATION, "");//地点用需要可以添加) event.put(Events.CALENDAR_ID, calId); event.put(Events.DTSTART, model.getTime());//开始时间 event.put(Events.DTEND, model.getTime());//结束时间(重复时候不设置,设置DURATION) // event.put(Events.DURATION, "PT1H");//重复时候设置 event.put(Events.STATUS, Events.STATUS_CONFIRMED); event.put(Events.HAS_ATTENDEE_DATA, 0); event.put(Events.HAS_ALARM, 1);//是否生效? event.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());//时区,必须有 // event.put(Events.RRULE,"FREQ=DAILY;INTERVAL=1;WKST=SU");//FREQ=DAILY;INTERVAL=1是每天循环,WKST=SU是设置从周日开始 Uri newEvent = MainApplication.context.getContentResolver().insert(eventsUri, event); // 事件提醒的设定 long id = Long.parseLong(newEvent != null ? newEvent.getLastPathSegment() : "1"); ContentValues values = new ContentValues(); values.put(Reminders.EVENT_ID, id); // 10分钟 //15分钟 //30分钟 //45分钟 //1小时 //2小时 //3小时 //6小时 //12小时 //1天 String advanceTime = model.getAdvanceTime(); //提前提醒时间 min switch (advanceTime) { case "10分钟": values.put(Reminders.MINUTES, "10"); break; case "15分钟": values.put(Reminders.MINUTES, "15"); break; case "30分钟": values.put(Reminders.MINUTES, "30"); break; case "45分钟": values.put(Reminders.MINUTES, "45"); break; case "1小时": values.put(Reminders.MINUTES, "60"); break; case "2小时": values.put(Reminders.MINUTES, "120"); break; case "3小时": values.put(Reminders.MINUTES, "180"); break; case "6小时": values.put(Reminders.MINUTES, "360"); break; case "12小时": values.put(Reminders.MINUTES, "720"); break; case "1天": values.put(Reminders.MINUTES, "1440"); break; } values.put(Reminders.METHOD, Reminders.METHOD_ALERT);//提醒方式 MainApplication.context.getContentResolver().insert(remindersUri, values); } /** * 根据账户查询账户日历 * * @return List */ public static List queryEvents() { List calendars = new ArrayList(); Cursor cursor; // 本地帐户查询:ACCOUNT_TYPE_LOCAL是一个特殊的日历账号类型,它不跟设备账号关联。这种类型的日历不同步到服务器 // 如果是谷歌的账户是可以同步到服务器的 cursor = MainApplication.context.getContentResolver().query(eventsUri, EVENTS_COLUMNS, Calendars.ACCOUNT_NAME + " = ? ", new String[]{ACCOUNT_NAME}, null); while (cursor != null && cursor.moveToNext()) { EventModel eventModel = new EventModel(); eventModel.setId(cursor.getString(0)); eventModel.setTime(cursor.getString(5)); eventModel.setContent(cursor.getString(3)); int title = cursor.getColumnIndex("title"); eventModel.setTitle(cursor.getString(title)); calendars.add(eventModel); } return calendars; } /** * 更新某条Event * * @param model model */ public static void updateEvent(EventModel model) { ContentValues contentValues = new ContentValues(); contentValues.put(Events.TITLE, model.getTitle()); contentValues.put(Events.DTSTART, model.getTime()); contentValues.put(Events.DESCRIPTION, model.getContent()); MainApplication.context.getContentResolver().update(eventsUri, contentValues , Events._ID + " =? ", new String[]{model.getId()}); } /** * 删除某条Event * * @param id id * @return The number of rows deleted. */ public static int deleteEvent(String id) { return MainApplication.context.getContentResolver() .delete(eventsUri, Events._ID + " =? ", new String[]{id}); } /** * 删除所有Event * * @return The number of rows deleted. */ public static int deleteAllEvent() { return MainApplication.context.getContentResolver() .delete(eventsUri, Events.CALENDAR_ID + " =? ", new String[]{queryCalId()}); } /** * 查询 calendar_id * * @return calId */ @SuppressLint("Range") private static String queryCalId() { Cursor userCursor = null; try { userCursor = MainApplication.context.getContentResolver().query(calendarsUri, null, "name=?", new String[]{ACCOUNT_NAME}, null); } catch (Exception e) { e.printStackTrace(); } if (userCursor == null) { return null; } if (userCursor.getCount() > 0) { userCursor.moveToLast(); //是向符合条件的最后一个账户添加 return userCursor.getString(userCursor.getColumnIndex("_id")); } return ""; } /** * 添加账户 */ private static void addAccount() { ContentValues value = new ContentValues(); value.put(Calendars.ACCOUNT_NAME, ACCOUNT_NAME); value.put(Calendars.ACCOUNT_TYPE, "LOCAL"); value.put(Calendars._SYNC_ID, "1"); value.put(Calendars.DIRTY, "1"); value.put(Calendars.NAME, ACCOUNT_NAME); value.put(Calendars.CALENDAR_DISPLAY_NAME, ACCOUNT_NAME); value.put(Calendars.CALENDAR_COLOR, Color.BLUE); value.put(Calendars.CALENDAR_ACCESS_LEVEL, Calendars.CAL_ACCESS_OWNER); value.put(Calendars.CALENDAR_TIME_ZONE, TimeZone.getDefault().getID()); value.put(Calendars.VISIBLE, "1"); value.put(Calendars.SYNC_EVENTS, "1"); value.put(Calendars.OWNER_ACCOUNT, ACCOUNT_NAME); value.put(Calendars.CAN_ORGANIZER_RESPOND, "1"); Uri calendarUri = Calendars.CONTENT_URI; calendarUri = calendarUri.buildUpon() .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true") .appendQueryParameter(Calendars.ACCOUNT_NAME, ACCOUNT_NAME) .appendQueryParameter(Calendars.ACCOUNT_TYPE, "1").build(); MainApplication.context.getContentResolver().insert(calendarUri, value); } }

插入一个新事件的规则:

必须包含CALENDAR_ID和DTSTART字段必须包含EVENT_TIMEZONE字段,使用TimeZone.getDefault().getID()方法获取默认时区对于非重复发生的事件,必须包含DTEND字段对重复发生的事件,必须包含一个附加了RRULE或RDATE字段的DURATION字段


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3