Android calendar 基础知识完解

2,638 阅读2分钟

参考文档:developer.android.com/guide/topic…

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

正常情况下,如要读取或写入日历数据,则应用的清单文件必须包含用户权限中所述的适当权限。为简化常见操作的执行,日历提供程序提供了一组 Intent(如日历 Intent 中所述)。这些 Intent 会将用户带入日历应用,以便执行插入事件、查看事件和编辑事件。

用户权限: 如要读取日历数据,应用必须在其清单文件中加入 READ_CALENDAR 权限。清单文件中必须包含用于删除、插入或更新日历数据的 WRITE_CALENDAR 权限:

第一 获取当前的日程事件

private static String CALENDER_EVENT_URL = "content://com.android.calendar/events";

private void checkPermission() { // 获取权限

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR)
            != PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR)
                    != PackageManager.PERMISSION_GRANTED) {
        Log.i(TAG,"没有权限进行申请");
        ActivityCompat.requestPermissions(this, new String[]
                {Manifest.permission.READ_CALENDAR,Manifest.permission.WRITE_CALENDAR},100);
    } else {
        Log.i(TAG,"已经有权限");
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if(requestCode == 100){
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Log.i(TAG,"用户同意权限申请");
        } else {
            Log.i(TAG,"用户不同意权限申请");
        }
    }
}

// 获取CalendarEvent事件的数据
private void getCalendarEvent() {
    String startTime = "";
    String endTime = "";
    String eventTitle = "";
    String description = "";
    String location = "";
    long startEventTime ;
    long currentTime ;
    long endEventTime;
    int reminderTime;
    List<Long> listTime;
    listTime = new ArrayList<Long>();
    Map map = new HashMap();          //创建Map 集合
    Cursor eventCursor = getContentResolver().query(Uri.parse(CALENDER_EVENT_URL), null, null, null, null);
    while (eventCursor.moveToNext()) {
        Log.i(TAG,"·········································· " );
        eventTitle = eventCursor.getString(eventCursor.getColumnIndex("title"));    //获取日历事件 的标题
        description = eventCursor.getString(eventCursor.getColumnIndex("description"));  //获取日历事件 的描述
        location = eventCursor.getString(eventCursor.getColumnIndex("eventLocation"));  //获取日历事件 的地点
        long eventId = eventCursor.getLong(eventCursor.getColumnIndex(CalendarContract.Calendars._ID));
        Log.i(TAG,"eventId:"+eventId );
        startEventTime  = Long.parseLong(eventCursor.getString(eventCursor.getColumnIndex("dtstart"))); //获取 日程 开始的时间
        Log.i(TAG,"startEventTime:  "  + startEventTime);
        currentTime =  Calendar.getInstance().getTimeInMillis();  //获取当前时间
        Log.i(TAG,"currentTime:  "  + currentTime);
        if (startEventTime > currentTime) {  //当日历设定时间大于当前时间
            listTime.add(startEventTime);
            map.put(startEventTime,description);//存储键值
        }
        endEventTime = Long.parseLong(eventCursor.getString(eventCursor.getColumnIndex("dtend")));
        Log.i(TAG,"endEventTime:  "  + endEventTime);
        startTime = timeStamp2Date(startEventTime);
        endTime = timeStamp2Date(Long.parseLong(eventCursor.getString(eventCursor.getColumnIndex("dtend")))); //获取日程结束的时间
        Log.i(TAG,"eventTitle: " + eventTitle + "\n" +
                "description: " + description + "\n" +
                "location: " + location + "\n" +
                "startTime: " + startTime + "\n" +
                "endTime: " + endTime + "\n"
        );
    }
    Collections.sort(listTime); //将list 从小到大排序 根据时间大小 获取最近事件
    if(map.size() > 0) {
        Object value = map.get(listTime.get(0)); //获取键所对应的值
        Log.i(TAG,"获取最近一次事件:" + value);
    }
}

// 该事件所涉及到的字段如下表所示: