calendar 日历事件 获取最近日程

1、简介

获取日历中设置的距离当前最近的日程

2、目录结构

在这里插入图片描述

3、AndroidManifest 文件

添加关于日历的相关权限

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

4、功能文件

package com.example.tssh.mycalendar;

import android.Manifest;
import android.content.pm.PackageManager;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.provider.CalendarContract;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import org.json.JSONObject;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class MainActivity extends AppCompatActivity {

    private String  TAG = "MainActivity: ";

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        checkPermission();  //权限检查
        registerObserver(); //注册日程事件改变监听
        getCalendarEvent();  //获得 日历事件
    }

    //获得日历数据
    private void getCalendarEvent() {
        String startTime = "";
        String endTime = "";
        String eventTitle = "";
        String description = "";
        String location = "";

        long startEventTime ;
        long currentTime ;
        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"));  //获取日历事件 的地点
            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);//存储键值
            }
            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 从小到大排序 根据时间大小 获取最近事件
        Object value = map.get(listTime.get(0)); //获取键所对应的值
        Log.i(TAG,"获取最近一次事件:" + value);
    }


    //当有日历日程修改时到来时 调用 onChange 函数
    private ContentObserver newCalendarContentObserver = new ContentObserver(new Handler()) {
        public void onChange(boolean selfChange) {
            System.out.println("接收到的日历事件监听");
            getCalendarEvent();
        }
    };


    private void registerObserver() {
        getContentResolver().registerContentObserver(CalendarContract.Events.CONTENT_URI, true,
                newCalendarContentObserver);
    }

    private synchronized void unregisterObserver() {
        try {
            if (newCalendarContentObserver != null) {
                getContentResolver().unregisterContentObserver(newCalendarContentObserver);
            }
        } catch (Exception e) {
            Log.e(TAG, "unregisterObserver fail");
        }

    }

    //sd 卡权限检查
    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,"已经有权限");
        }
    }



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


    /**
     * 时间戳转换为字符串
     * @param time:时间戳
     * @return
     */
    private static String timeStamp2Date(long time) {
        String format = "yyyy-MM-dd HH:mm:ss";
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(new Date(time));
    }


    protected  void  onDestroy() {
         unregisterObserver();
        super.onDestroy();
    }

}

5、log 日志打印

在这里插入图片描述
在这里插入图片描述

文献参考:
Android Calendar Provider(日历事件)
https://blog.csdn.net/wlwh90/article/details/70765860

Android–日历事件获取
https://blog.csdn.net/chaoyu168/article/details/81187327

安卓日历日程事件获取和监听汇总
https://blog.csdn.net/lanbojini1209/article/details/55510891

通过registerContentObserver(注册监听者)配合URI来实现恶意敏感信息窃取相关
https://blog.csdn.net/u014021893/article/details/59109403

猜你喜欢

转载自blog.csdn.net/qq_27061049/article/details/84863505