此项目是仿滴答清单做的一个日程表,现包括的功能有:日视图、三日视图、周视图、月视图、列表视图(周月可自由切换,左右滑动切换周或月份)。
1、 网络请求功能完善;
2、 同步手机的日程表;
3、 可以增加日历事件,并可选择是否同步到手机本身日程表;
4、 可设置提醒事件功能;
5、 日历事件保存到数据库;
6、 同步google邮件账号或是其他黄历事件;
7、 事件功能分类展示;
8、 暂进还没想到功能完善。
此工程是根据以下两个项目改进的项目:
依赖的工程分别是 java-week-view项目,地址是:https://github.com/alamkanak/Android-Week-View
android-collapse-calendar-view项目,地址是:https://github.com/blazsolar/android-collapse-calendar-view
由于这两个项目都不能满足我的需求,且这两个项目开发人员近期都不维护了,上一次更新还是两年前,还存在一些bug。所以就在他们项目代码基础上,重新编码,实现我想要的效果。 古人云,不要重复造轮子,况且开发人员把代码公布出来,应该不会涉及到侵权问题吧,如果涉及到侵权,请及时联系我。 下图是展示日视图、三日视图、周视图的效果图 :
下图是展示月视图、日程列表的效果图 :
日程列表,周月可自由切换。
项目地址:
https://github.com/xiewenfeng/calendarSchedule
同步手机系统日程
从android 6.0起读取手机日程也算是危险权限,需要单独申请,下面是申请读取手机日程权限代码:
/**
* android 6.0 以上申请权限
*/
public static boolean requestPermission(Activity activity) {
WeakReference<Activity> activityWeakReference = new WeakReference<Activity>(activity);
Activity useActivity = activityWeakReference.get();
//判断当前Activity是否已经获得了该权限
if (ContextCompat.checkSelfPermission(activity.getApplicationContext(),Manifest.permission.READ_CALENDAR)!= PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(activity.getApplicationContext(),Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
//如果App的权限申请曾经被用户拒绝过,就需要在这里跟用户做出解释
if (ActivityCompat.shouldShowRequestPermissionRationale(useActivity,
Manifest.permission.READ_CALENDAR) || ActivityCompat.shouldShowRequestPermissionRationale(useActivity,
Manifest.permission.WRITE_CALENDAR)) {
Toast.makeText(useActivity, useActivity.getString(R.string.write_calendar), Toast.LENGTH_SHORT).show();
} else {
//进行权限请求
ActivityCompat.requestPermissions(useActivity,
new String[]{Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR},
EXTERNAL_CALENDAR_REQ_CODE);
}
return false;
} else {
//申请成功,进行相应操作
return true;
}
}
下面是获取某年某月的日程实现
/**
* 获取某月某日的日历
* @param year
* @param month
*/
public static void getCalendarEvent(Context context, int year, int month) throws Exception {
Calendar beginTime = Calendar.getInstance();
beginTime.set(year, month-1, 00, 0, 0);//系统月份从0开始
Calendar endTime = Calendar.getInstance();
endTime.set(year, month, 00, 0, 0);
String selection = "((dtstart >= "+beginTime.getTimeInMillis()+") AND (dtend <= "+endTime.getTimeInMillis()+"))";
Cursor eventCursor = context.getContentResolver().query(Uri.parse(CalendarUtils.calanderEventURL), null,
selection, null, null);
if (eventCursor.getCount() > 0) {
if (eventCursor.moveToFirst()) {
do {
String eventTitle = eventCursor.getString(eventCursor.getColumnIndex("title"));//日程事件标题
String description = eventCursor.getString(eventCursor.getColumnIndex("description"));//日程事件描术
String dtstart = eventCursor.getString(eventCursor.getColumnIndex("dtstart"));//日程事件开始时间,是13位字符串
// String address = eventCursor.getString(eventCursor.getColumnIndex("event_location"));//日程事件的位置,发现没有这个字段
String timeStart = TimeUtil.timeFormatStr(dtstart);//将日程时间改成yyyy-MM-dd hh:mm:ss形式
String dtend = eventCursor.getString(eventCursor.getColumnIndex("dtend"));//日程事件结束时间
String timeEnd = TimeUtil.timeFormatStr(dtend);//将日程时间改成yyyy-MM-dd hh:mm:ss形式
String calendar_id = eventCursor.getString(eventCursor.getColumnIndex("calendar_id"));//日程事件的id
String startTime = timeStart.substring(11, 16);//截取日程事件的开始时间的 时和分, hh:mm
String endtime = timeEnd.substring(11, 16);//截取日程事件的结束时间的 时和分, hh:mm
int startday = Integer.parseInt(timeStart.substring(8, 10));//截取日程事件的开始时间的 day, dd
int endday = Integer.parseInt(timeEnd.substring(8, 10));//截取日程事件的结束时间的 day, dd
int startMonth = Integer.parseInt(timeStart.substring(5, 7));//截取日程事件的开始时间的 月, mm
int endMonth = Integer.parseInt(timeEnd.substring(5, 7));//截取日程事件的结束时间的 月, mm
int startYear = Integer.parseInt(timeStart.substring(0, 4));//截取日程事件的开始时间的 年, yyyy
int endYear = Integer.parseInt(timeEnd.substring(0, 4));//截取日程事件的结束时间的 年, yyyy
} while (eventCursor.moveToNext());
}
}
eventCursor.close();
return eventModels;
}