参考了以下文章:
http://blog.csdn.net/zhaoshuyu111/article/details/53195142?ref=myread
http://blog.sina.com.cn/s/blog_48964b120101m0db.html
个人感觉写的时候,root过的设备,可以先在里面设置自己想要的效果,然后去/data/data/com.android.providers.calendar/databases/calendar.db pull出来,看看数据库,再模仿这个值去设置自己想要的效果的值
需求写完,先写一下对日历一些字段的理解:
Events._ID :主键,日历事件的唯一标识,如果你设置这个值为1,你的日历事件就是事件1
Events.CALENDAR_ID:用户id,一个手机可能有多个用户
Events.DTSTART :事件的开始时间
Events.DURATION:事件的持续时间,这是指这个事件的,和开始时间结合组成了事件的结束时间,比如P7200S,假如开始时间是9:00,那么结束时间是11:00
Event.DTEND:日程的结束时间,单位毫秒,假如设置2017年9月30,这个事件到9月30就结束了,不会无限重复
Events.RRULE:事件的重复规则,比如每天,每周周1,每月第几天,每年第几个月,这个规则复杂,我另外转了一篇文章讲解了这个规则
Events.EVENT_TIMEZ :时区,必须要设置的
Events.HAS_ALA :添加闹钟
需求:通过app添加日程,在系统日历里面可以查看到
private String tag = "test";
private int[] startTime = {2017,8,28,15,14};//日程开始时间,年,月(0-11标识1-12月),日,时,分
private int[] endTime= {2017,8,28,20,20};
private int remindersTime = 60;//提前多少分钟提醒
private String description = "学习交流";
private int event_id = 1001;
private int frequency = 3;
/** * @function:日历日程 * int operation: 0,增,;1,删;2,改 * int[] startTime:开始时间,包括年月日,时分秒 * int[] endTime :开始时间,包括年月日,时分秒 * int remindersTime:提前提醒时间,单位:分钟 * String description:事件描述 * long eventId:事件id * int frequency:0,仅一次;1,每天;2,每周(当天星期);3,每月(当天) * */ private int setCalendar(int operation,int[] startTime, int[] endTime , int remindersTime, String description, long eventId, int frequency) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED){ }else { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(new String[]{"android.permission.READ_CALENDAR"},1); } } if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED){ }else { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(new String[]{"android.permission.WRITE_CALENDAR"},2); } } String calanderURL = "content://com.android.calendar/calendars"; String calanderEventURL = "content://com.android.calendar/events"; String calanderRemiderURL = "content://com.android.calendar/reminders"; //获取要出入的账户的id String calId = ""; Cursor userCursor = getContentResolver().query(Uri.parse(calanderURL), null, null, null, null); if(userCursor.getCount() > 0){ userCursor.moveToFirst(); calId = userCursor.getString(userCursor.getColumnIndex("_id")); } Log.i(tag,"------calId--------"+calId); switch (operation){ case 0: Log.i(tag,"--------operation=------------"+operation); case 2: Log.i(tag,"--------operation=------------"+operation); Calendar mCalendar = getInstance(); mCalendar.set(startTime[0],startTime[1],startTime[2],startTime[3],startTime[4]); long startTimeLong = mCalendar.getTimeInMillis(); mCalendar.set(endTime[0],endTime[1],endTime[2],endTime[3],endTime[4]); long endTimeLong = mCalendar.getTimeInMillis(); String RRULE =""; switch (frequency){ case 0: RRULE = "";//一次,不用设置 break; case 1: RRULE = "FREQ=DAILY";//每天 break; case 2: RRULE = "FREQ=WEEKLY;WKST=SU;"+CommonalityMethod.getDayOfWeek();//每周(当天星期) break; case 3: RRULE = "FREQ=MONTHLY;" +"BYMONTHDAY="+CommonalityMethod.getDayOfMonth();//每天 break; } ContentValues event = new ContentValues(); event.put(Events.TITLE, "测试日历"); event.put(Events.DESCRIPTION, description); event.put(Events.CALENDAR_ID,calId);//用户id,不能修改,只能获取 event.put(Events._ID,eventId);//事件id,可以传进来作唯一标记 if (frequency != 0){ Log.i(tag,"========RRUL========="+RRULE); event.put(Events.RRULE,RRULE); } event.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().getID().toString()); event.put(Events.HAS_ALARM,1); event.put(Events.DTSTART, startTimeLong); event.put(Events.DURATION,"P7200S");//持续时间,比如开始时间是1点,持续7200s就是结束时间是3点 Uri newEvent = getContentResolver().insert(Uri.parse(calanderEventURL), event); if (null == newEvent){ Log.i(tag,"------newEvent--------"+"创建日程失败"); return 1; } ContentValues values = new ContentValues(); values.put(Reminders.MINUTES, remindersTime);//提前多久提醒,单位:分钟 values.put(Reminders.EVENT_ID,eventId); values.put(Reminders.METHOD, Reminders.METHOD_ALERT); ContentResolver cr1 = getContentResolver(); // 为刚才新添加的event添加reminder Uri uri = cr1.insert(Uri.parse(calanderRemiderURL), values); // 调用这个方法返回值是一个Uri if(uri == null) { // 添加闹钟提醒失败直接返回 Log.i(tag,"------newEvent--------"+"添加提醒失败"); return 1; } break; case 1: Log.i(tag,"--------operation=------------"+operation); Cursor deleteEventCursor = getContentResolver().query(Uri.parse(calanderEventURL), null, null, null, null); try { if (deleteEventCursor == null || deleteEventCursor.getCount() ==0){//查询返回空值 Log.i(tag,"--------operation=-----查询返回空值-------"); return 1; } Log.i(tag,"--------operation=-----deleteEventCursor.getCount()-------"+deleteEventCursor.getCount()); for (deleteEventCursor.moveToFirst(); !deleteEventCursor.isAfterLast(); deleteEventCursor.moveToNext()) { int deleteEventId = deleteEventCursor.getInt(deleteEventCursor.getColumnIndex(Events._ID)); Log.i(tag,"--------operation=-----deleteEventId-------"+deleteEventId); if (deleteEventId == eventId){ Uri deleteUri = ContentUris.withAppendedId(Uri.parse(calanderEventURL), deleteEventId); int rows = getContentResolver().delete(deleteUri, null, null); if (rows == -1) { //事件删除失败 Log.i(tag,"------事件删除失败----"); return 1; }else { Log.i(tag,"------事件删除成功----"); } } } }finally { if (deleteEventCursor != null) { deleteEventCursor.close(); } } break; } return 0; }
import android.util.Log; import java.util.Calendar; import java.util.Date; /** * Created by Administrator on 2017/9/26. */ public class CommonalityMethod { private static String Tag = "CommonalityMethod"; public static String getDayOfWeek(){ Calendar todayCalendar = Calendar.getInstance(); todayCalendar.setTime(new Date()); int week =todayCalendar.get(Calendar.DAY_OF_WEEK); Log.i(Tag,"------week-------"+week); String WEEK = ""; switch (week){ case 1: WEEK = "SU"; break; case 2: WEEK = "MO"; break; case 3: WEEK = "TU"; break; case 4: WEEK = "WE"; break; case 5: WEEK = "TH"; break; case 6: WEEK = "FR"; break; case 7: WEEK = "SA"; break; } return "BYDAY="+WEEK; } public static int getDayOfMonth(){ Calendar todayCalendar = Calendar.getInstance(); todayCalendar.setTime(new Date()); Log.i(Tag,"-----------getDayOfMonth--------------"+todayCalendar.get(Calendar.DAY_OF_MONTH)); return todayCalendar.get(Calendar.DAY_OF_MONTH); }