calendar添加日程到系统日历

参考了以下文章:

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);
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值