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