Android同步日程到系统日历

import android.Manifest;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.SQLException;
import android.net.Uri;
import android.os.Build;
import android.provider.CalendarContract;
import android.support.v4.app.ActivityCompat;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

import java.util.Calendar;
import java.util.TimeZone;

/**
 * 同步日历事项提醒到系统日历
 */
public class CalendarReminderUtils {

    //Android2.2版本以后的URL,之前的就不写了
    private static String calanderURL = "content://com.android.calendar/calendars";
    private static String calanderEventURL = "content://com.android.calendar/events";
    private static String calanderRemiderURL = "content://com.android.calendar/reminders";

    /**
     *
     * @param context
     * @param dtStart
     * @param title
     * @param description
     * @return
     */
    public static int addCalendarEvent(Context context, String dtStart, String title, String description) {
        return addCalendarEvent(context, dtStart, null, title, description, null, null, 0);
    }

    /**
     * 添加日历事件
     * 时间 要求格式 yyyy/mm/dd/hh/mm
     *
     * @param context
     * @param dtStart     提醒开始时间
     * @param dtEnd       提醒结束时间
     * @param title       日程标题
     * @param description 描述
     * @param location    地点位置
     * @param userName    用户名
     * @param preHintTime 提前提醒时间
     * @return
     */
    public static int addCalendarEvent(Context context, String dtStart, String dtEnd, String title, String description, String location, String userName, long preHintTime) {
        if (Integer.parseInt(Build.VERSION.SDK) >= 8) {
            calanderURL = "content://com.android.calendar/calendars";
            calanderEventURL = "content://com.android.calendar/events";
            calanderRemiderURL = "content://com.android.calendar/reminders";
        } else {
            calanderURL = "content://calendar/calendars";
            calanderEventURL = "content://calendar/events";
            calanderRemiderURL = "content://calendar/reminders";
        }

        Cursor userCursor = context.getContentResolver().query(Uri.parse(calanderURL), null, null, null, null);
        //如果小于1代表没有账户
        if (userCursor.getCount() < 1) {
            //添加账户
            initCalendars(context, userName);
        }

        // 获取账户的id
        String calId = "";
        if (userCursor.getCount() > 0) {
            //注意:是向最后一个账户添加,开发者可以根据需要改变添加事件 的账户
            userCursor.moveToLast();
            calId = userCursor.getString(userCursor.getColumnIndex("_id"));
        }

        ContentValues event = new ContentValues();
        event.put("title", title);
        event.put("description", description != null ? description : "");
        // 插入账户
        event.put("calendar_id", calId);
        event.put("eventLocation", location != null ? location : "");


        if (TextUtils.isEmpty(dtStart)) {
            Toast.makeText(context, "提醒开始时间不能为空!", Toast.LENGTH_SHORT).show();
            return -1;
        }
        if (TextUtils.isEmpty(dtEnd)) {
            dtEnd = dtStart;
        }
        Calendar mCalendar = Calendar.getInstance();
        //提醒开始时间
        String[] startTime = dtStart.split("/");
        mCalendar.set(Calendar.YEAR, Integer.parseInt(startTime[0]));//年
        mCalendar.set(Calendar.MONTH, Integer.parseInt(startTime[1])-1);//月
        mCalendar.set(Calendar.DAY_OF_MONTH, Integer.parseInt(startTime[2]));//日
        mCalendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(startTime[3]));//时
        mCalendar.set(Calendar.MINUTE, Integer.parseInt(startTime[4]));//分
        long start = mCalendar.getTime().getTime();

        //提醒结束时间
        String[] endTime = dtEnd.split("/");
        mCalendar.set(Calendar.YEAR, Integer.parseInt(endTime[0]));//年
        mCalendar.set(Calendar.MONTH, Integer.parseInt(endTime[1])-1);//月
        mCalendar.set(Calendar.DAY_OF_MONTH, Integer.parseInt(endTime[2]));//日
        mCalendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(endTime[3]));//时
        mCalendar.set(Calendar.MINUTE, Integer.parseInt(endTime[4]));//分
        long end = mCalendar.getTime().getTime();

        event.put("dtstart", start);
        event.put("dtend", end);

        event.put("hasAlarm", 1);
        event.put(CalendarContract.Events.EVENT_TIMEZONE, "Asia/Shanghai");  //这个是时区,必须有,
        //添加事件
        Uri newEvent = context.getContentResolver().insert(Uri.parse(calanderEventURL), event);
        //事件提醒的设定
        long event_id = Long.parseLong(newEvent.getLastPathSegment());
        ContentValues values = new ContentValues();
        values.put("event_id", event_id);
        // 提前10分钟有提醒
        values.put("minutes", preHintTime);
        try {
            context.getContentResolver().insert(Uri.parse(calanderRemiderURL), values);
        } catch (SQLException e) {
            Log.e("error_code", "sql异常,插入失败");
        }

        return 0;
    }

    /**
     * 添加账户
     *
     * @param context
     * @param accountName 账户名
     */
    private static void initCalendars(Context context, String accountName) {

        TimeZone timeZone = TimeZone.getDefault();
        ContentValues value = new ContentValues();
        value.put(CalendarContract.Calendars.NAME, "yt");

        value.put(CalendarContract.Calendars.ACCOUNT_NAME, accountName);//日历账户名称
        value.put(CalendarContract.Calendars.ACCOUNT_TYPE, "com.android.exchange");
        value.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, accountName);
        value.put(CalendarContract.Calendars.VISIBLE, 1);
        value.put(CalendarContract.Calendars.CALENDAR_COLOR, -9206951);
        value.put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_OWNER);
        value.put(CalendarContract.Calendars.SYNC_EVENTS, 1);
        value.put(CalendarContract.Calendars.CALENDAR_TIME_ZONE, timeZone.getID());
        value.put(CalendarContract.Calendars.OWNER_ACCOUNT, accountName);
        value.put(CalendarContract.Calendars.CAN_ORGANIZER_RESPOND, 0);

        Uri calendarUri = CalendarContract.Calendars.CONTENT_URI;
        calendarUri = calendarUri.buildUpon()
                .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
                .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, accountName)
                .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, "com.android.exchange")
                .build();
        //插入账号数据
        context.getContentResolver().insert(calendarUri, value);
    }

    /**
     * 删除日历事件
     */
    public static int deleteCalendarEvent(Context context, String title) {
        int rownum = 0;
        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions((Activity) context, new String[]{"android.permission.WRITE_CALENDAR"}, 0x1100);
        } else {
            rownum = context.getContentResolver().delete(CalendarContract.Events.CONTENT_URI, CalendarContract.Events.TITLE + " = ?", new String[]{title});
        }
        return rownum;
    }

    /**
     * 更新日程表事件
     *
     * @param context
     * @param dtStart     开始时间 要求格式 yyyy/mm/dd/hh/mm
     * @param dtEnd       结束时间 要求格式 yyyy/mm/dd/hh/mm
     * @param title
     * @param description
     * @return
     */
    public static int updataCalendarEvent(Context context, String dtStart, String dtEnd, String title, String description) {
        ContentResolver cr = context.getContentResolver();
        ContentValues values = new ContentValues();
        Uri updateUri = null;
        Calendar mCalendar = Calendar.getInstance();
        //修改开始时间
        if (!TextUtils.isEmpty(dtStart)) {
            String[] startTime = dtStart.split("/");
            mCalendar.set(Calendar.YEAR, Integer.parseInt(startTime[0]));//年
            mCalendar.set(Calendar.MONTH, Integer.parseInt(startTime[1])-1);//月
            mCalendar.set(Calendar.DAY_OF_MONTH, Integer.parseInt(startTime[2]));//日
            mCalendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(startTime[3]));//时
            mCalendar.set(Calendar.MINUTE, Integer.parseInt(startTime[4]));//分
            long start = mCalendar.getTime().getTime();
            values.put(CalendarContract.Events.DTSTART, start);
        }
        //修改结束时间
        if (!TextUtils.isEmpty(dtEnd)) {
            String[] endTime = dtEnd.split("/");
            mCalendar.set(Calendar.YEAR, Integer.parseInt(endTime[0]));//年
            mCalendar.set(Calendar.MONTH, Integer.parseInt(endTime[1])-1);//月
            mCalendar.set(Calendar.DAY_OF_MONTH, Integer.parseInt(endTime[2]));//日
            mCalendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(endTime[3]));//时
            mCalendar.set(Calendar.MINUTE, Integer.parseInt(endTime[4]));//分
            long end = mCalendar.getTime().getTime();
            values.put(CalendarContract.Events.DTEND, end);
        }
        //修改标题
        if (!TextUtils.isEmpty(title)) {
            values.put(CalendarContract.Events.TITLE, title);
        }
        //修改描述
        if (!TextUtils.isEmpty(description)) {
            values.put(CalendarContract.Events.DESCRIPTION, description);
        }
        values.put(CalendarContract.Events.HAS_ALARM,1);//是否闹铃提醒
        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions((Activity) context, new String[]{"android.permission.WRITE_CALENDAR"}, 0x1100);
        }
        try {
            int rows = cr.update(CalendarContract.Events.CONTENT_URI, values, CalendarContract.Events.TITLE + " = ?", new String[]{title});
 //int rows = cr.update(CalendarContract.Events.CONTENT_URI, values, CalendarContract.Events.TITLE + " = ? AND "+CalendarContract.Events.DTSTART+" = ? ", new String[]{title,date});
        }catch (SQLException e){
            e.printStackTrace();
        }
        return 0;
    }


    /**
     * 遍历出整个表格中所有的属性值
     *
     * @param context
     */
    public static void queryAtrValue(Context context) {
        Uri uri = Uri.parse(calanderEventURL);
        Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
        while (cursor.moveToNext()) {
            int columnCount = cursor.getColumnCount();
            Log.e("callback", "columnCount :" + columnCount);//多少个属性
            for (int i = 0; i < columnCount; i++) {
                //获取到属性的名称
                String columnName = cursor.getColumnName(i);
                //获取到属性对应的值
                String message = cursor.getString(cursor.getColumnIndex(columnName));
                //打印属性和对应的值
                Log.e("callback", columnName + " : " + message);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值