android日程表实现---仿滴答清单

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/smileiam/article/details/76153191

此项目是仿滴答清单做的一个日程表,现包括的功能有:日视图、三日视图、周视图、月视图、列表视图(周月可自由切换,左右滑动切换周或月份)。

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;
    }

猜你喜欢

转载自blog.csdn.net/smileiam/article/details/76153191