日历

Android向系统日历中添加行程

2019-08-15  本文已影响0人  leap_

申请动态权限

<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>

日历的content Provider的uri

private static String CALENDER_URL = "content://com.android.calendar/calendars";
private static String CALENDER_EVENT_URL = "content://com.android.calendar/events";
private static String CALENDER_REMINDER_URL = "content://com.android.calendar/reminders";

添加日历行程

解题思路:通过ContentProvider向系统日历中添加数据


日历提供程序是用户日历事件的存储区。您可以利用 Calendar Provider API 对日历、事件、参加者、提醒等执行查询、插入、更新和删除操作。

我们先来看一下Android jar包有关于日历提供的Provider

CalendarContract定义了日历和日程事件相关的数据模型:


日历提供程序数据模型的图像化表示
Claendar常量:(日历表)

Calendar的必须添加常量:

对于给定账户,只有在同时指定account_name和account_type时才能将其视为唯一账户,account_type字符串对应于AccountManager出注册账户时的账户验证器。

Calendar的建议添加常量:

Event常量:(事件表,所属日历表)
Reminder常量 :(提醒表,所属事件表)
Instances常量:(实例表,所属事件表,与事件一对一映射关系,详细解析见上文)

向系统Calendar中添加Event

public  class CalendarProviderUtil {
    
    // ContentProvider的uri
    private static Uri calendarUri = CalendarContract.Calendars.CONTENT_URI;
    private static Uri eventUri = CalendarContract.Events.CONTENT_URI;
    private static Uri reminderUri = CalendarContract.Reminders.CONTENT_URI;

    private static ContentResolver contentResolver;
    
    /**
     * 检查是否有日历表,有返回日历id,没有-1
     * */
    private static int isHaveCalender(){
        // 查询日历表的cursor
        Cursor cursor = contentResolver.query(calendarUri,null,null,null,null);
        if (cursor == null || cursor.getCount() == 0){
            return -1;
        }else {
            // 如果有日历表
            try {
                cursor.moveToFirst();
                // 通过cursor返回日历表的第一行的属性值 第一个日历的id
                return cursor.getInt(cursor.getColumnIndex(CalendarContract.Calendars._ID));
            }finally {
                cursor.close();
            }
        }
    }

    /**
     * 添加日历表
     * */
    private static long addCalendar(){
        // 时区
        TimeZone timeZone = TimeZone.getDefault();
        // 配置Calendar
        ContentValues value = new ContentValues();
        value.put(CalendarContract.Calendars.NAME, "我的日历表");
        value.put(CalendarContract.Calendars.ACCOUNT_NAME, "myAccount");
        value.put(CalendarContract.Calendars.ACCOUNT_TYPE, "myType");
        value.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, "myDisplayName");
        value.put(CalendarContract.Calendars.VISIBLE, 1);
        value.put(CalendarContract.Calendars.CALENDAR_COLOR, Color.BLUE);
        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, "myAccount");
        value.put(CalendarContract.Calendars.CAN_ORGANIZER_RESPOND, 0);
        value.put(CalendarContract.CALLER_IS_SYNCADAPTER,true);

        // 插入calendar
        Uri insertCalendarUri = contentResolver.insert(calendarUri,value);

        if (insertCalendarUri == null){
            return -1;
        }else {
            // return Integer.parseInt(insertCalendarUri.toString());
            return ContentUris.parseId(insertCalendarUri);
        }

    }

    /**
     *  添加日历事件
     * */
    public static void addEvent(Context context){

        // 创建contentResolver
        contentResolver = context.getContentResolver();

        // 日历表id
        int calendarId = isHaveCalender();
        if (calendarId == -1){
            addCalendar();
            calendarId = isHaveCalender();
        }

        // startMillis
        Calendar beginTime = Calendar.getInstance();
        beginTime.set(2019,8,15);
        long startMillis = beginTime.getTimeInMillis();
 
        // endMillis
        Calendar endTime = Calendar.getInstance();
        endTime.set(2019,8,15);
        long endMillis = endTime.getTimeInMillis();

        // 准备event
        ContentValues valueEvent = new ContentValues();
        valueEvent.put(CalendarContract.Events.DTSTART,startMillis);
        valueEvent.put(CalendarContract.Events.DTEND,endMillis);
        valueEvent.put(CalendarContract.Events.TITLE,"事件标题");
        valueEvent.put(CalendarContract.Events.DESCRIPTION,"事件描述");
        valueEvent.put(CalendarContract.Events.CALENDAR_ID,calendarId);
        valueEvent.put(CalendarContract.Events.EVENT_TIMEZONE,"Asia/Shanghai");

        // 添加event
        Uri insertEventUri = contentResolver.insert(eventUri,valueEvent);
        if (insertEventUri == null){
            Toast.makeText(context,"添加event失败",Toast.LENGTH_SHORT).show();
        }

        // 添加提醒
        long eventId = ContentUris.parseId(insertEventUri);
        ContentValues valueReminder = new ContentValues();
        valueReminder.put(CalendarContract.Reminders.EVENT_ID,eventId);
        valueReminder.put(CalendarContract.Reminders.MINUTES,15);
        valueReminder.put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALARM);
        Uri insertReminderUri = contentResolver.insert(reminderUri,valueReminder);
        if (insertReminderUri == null){
            Toast.makeText(context,"添加reminder失败",Toast.LENGTH_SHORT).show();
        }
    }
}

只测试了一下,有用,可能有bug

上一篇 下一篇

猜你喜欢

热点阅读