Android日历事件提醒

阅读: 评论:0

Android日历事件提醒

Android日历事件提醒

最近遇到一个需求,是要在特定的时间提示特定的用户干特定的是,比如你该吃早饭了呀、你该上厕所了呀、你该找女朋友了呀,我去,反正就是这么个需求。我想和推送差不多,不过推送什么的也不能百分百的推到,要对特定的用户提示特定的消息也很麻烦。于是乎就产生了通过系统日历来提示用户的方案。还是希望能帮到其他有类似需求的小伙伴,要是真帮到了希望能点个赞。

每天都要过得开心 ( ゜- ゜)つロ乾杯 !


Demo

Demo地址

关键代码

其实说白了就是通过ContentResolver给日历相关的数据库insert数据,那么系统就会根据你的要求来提示用户,就是这么简单。
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;/*** 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,};/*** 插入事件*/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, ACCOUNT_NAME);//标题event.put(Events.DESCRIPTION, Content());//备注event.put(Events.EVENT_LOCATION, "");//地点用需要可以添加)event.put(Events.CALENDAR_ID, calId);event.put(Events.DTSTART, Time());//开始时间event.put(Events.DTEND, Time());//结束时间event.put(Events.STATUS, Events.STATUS_CONFIRMED);event.put(Events.HAS_ATTENDEE_DATA, 1);event.put(Events.HAS_ALARM, 1);//是否生效?event.put(Events.EVENT_TIMEZONE, Default().getID());//时区,必须有Uri newEvent = ContentResolver().insert(eventsUri, event);// 事件提醒的设定long id = Long.parseLong(newEvent != null ? LastPathSegment() : "1");ContentValues values = new ContentValues();values.put(Reminders.EVENT_ID, id);values.put(Reminders.MINUTES, "10");//提前提醒时间 minvalues.put(Reminders.METHOD, Reminders.METHOD_ALERT);//提醒方式ContentResolver().insert(remindersUri, values);}/*** 根据账户查询账户日历** @return List*/public static List<EventModel> queryEvents() {List<EventModel> calendars = new ArrayList<>();Cursor cursor;// 本地帐户查询:ACCOUNT_TYPE_LOCAL是一个特殊的日历账号类型,它不跟设备账号关联。这种类型的日历不同步到服务器// 如果是谷歌的账户是可以同步到服务器的cursor = ContentResolver().query(eventsUri, EVENTS_COLUMNS,Calendars.ACCOUNT_NAME + " = ? ", new String[]{ACCOUNT_NAME}, null);while (cursor != null && veToNext()) {EventModel eventModel = new EventModel();eventModel.String(0));eventModel.String(5));eventModel.String(3));calendars.add(eventModel);}return calendars;}/*** 更新某条Event** @param model model*/public static void updateEvent(EventModel model) {ContentValues contentValues = new ContentValues();contentValues.put(Events.DTSTART, Time());contentValues.put(Events.DESCRIPTION, Content());ContentResolver().update(eventsUri, contentValues, Events._ID + " =? ", new String[]{Id()});}/*** 删除某条Event** @param id id* @return The number of rows deleted.*/public static int deleteEvent(String id) {return ContentResolver().delete(eventsUri, Events._ID + " =? ", new String[]{id});}/*** 删除所有Event** @return The number of rows deleted.*/public static int deleteAllEvent() {return ContentResolver().delete(eventsUri, Events.CALENDAR_ID + " =? ", new String[]{queryCalId()});}/*** 查询 calendar_id** @return calId*/private static String queryCalId() {Cursor userCursor = null;try {userCursor = ContentResolver().query(calendarsUri, null,"name=?", new String[]{ACCOUNT_NAME}, null);} catch (Exception e) {e.printStackTrace();}if (userCursor == null) {return null;}if (Count() > 0) {veToLast(); //是向符合条件的最后一个账户添加ColumnIndex("_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, Default().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();ContentResolver().insert(calendarUri, value);}}

使用方式(增删改查)

public class EventModel {private String id;private String time;private String content;...
}CalendarEvent.insertEvent(eventModel);
CalendarEvent.deleteEvent(id);
CalendarEvent.deleteAllEvent();
CalendarEvent.updateEvent(eventModel);
CalendarEvent.queryEvents()

PS:其实可以设置的参数非常的多,我暂时只是用涉及到了提示时间和提示内容,还有的操作需要小伙伴们自己发掘了,因为能搜到的栗子确实不多,我把一个比较有参考意义的类也上传了GitHub,在help包下,希望会对小伙伴有所帮助。

虽然不知道是谁写的,但挺有参考意义的。 .java

本文发布于:2024-01-28 22:32:36,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170645236110759.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:日历   事件   Android
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23