Android系统日历读取各厂商农历年重复event

农历按年重复事件读取

日历业务,发现android手机设置按年重复事件,各个厂商都支持按农历年重复,比如发生时间是每月正月十五,但读取出来,日期都是设定的公历日期,在第二年就肯定错了。
比如用户添加一个事件,设定2020年正月十五按农历年重复。系统日历读取出来,事件是2020年的2月8号按年重复。由于我们不知道是按农历年重复,我们就会认为到2021年也是2月8号。实际上系统里显示第二年的对应事件在是2月26号21年的正月十五。

这种情况比较常见的是用户设定了一个农历生日。各个厂家也有不同的设定农历重复的选项。

具体到我们读取系统日历事件,测试发现华为和vivo都会返回为公历事件。也就是rrule是"FREQ=YEARLY"这样。小米则读取不到农历事件。OPPO的rrule是"FREQ=LUNAR_YEARLY"。

最后和各路大神头脑风暴,发现可以针对YEARLY和LUNAR_YEARLY事件,都不上传rrule。而是把该事件的event的最近5年的instance读取出来,作为单个事件上传,并将rrule改成无重复事件。这样既能满足实际功能需要提示用户日历提醒的需求,也能最大情况兼容所有机型,不至于因为农历把日期整错。
对应写法是参考google官方日历文档

        if (rule != null && (rule.contains("FREQ=YEARLY") || rule.contains("FREQ=LUNAR_YEARLY"))) {
        ......
                    Uri.Builder builder = CalendarContract.Instances.CONTENT_URI.buildUpon();
            ContentUris.appendId(builder, startTime);
            ContentUris.appendId(builder, endTime);
            Cursor cur = contentResolver.query(builder.build(),
                    new String[] {
                            CalendarContract.Instances.EVENT_ID, 
                            CalendarContract.Instances.BEGIN,
                            CalendarContract.Instances.END,
                            CalendarContract.Instances.TITLE
                    },
                    CalendarContract.Instances.EVENT_ID + " = ?",
                    new String[]{eid},
                    null);
            if (cur != null) {
                while (cur.moveToNext()) {
                start = cur.getLong(cur.getColumnIndex(CalendarContract.Instances.BEGIN));
                int durationSecond = parseDuration(duration);
                end = start + durationSecond * 1000L;

这里针对end做了自己解析的处理。具体parseDuration方法参考我上一篇文章

但这样的问题是,小米手机的农历事件就没法读取。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值