【问题标题】:Add Weekly Event to Calendar将每周事件添加到日历
【发布时间】:2015-03-05 07:06:38
【问题描述】:

我想向原生Calendar 添加一个事件,在这里我想在每个Tuesday 上重复这个事件,直到31 December 2015

btnWeekly.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {       
        Calendar calendar = Calendar.getInstance(); 

        Intent intent = new Intent(Intent.ACTION_INSERT)
                .setData(Events.CONTENT_URI)
                .setType("vnd.android.cursor.item/event")
                .putExtra(Events.TITLE, "Tuesdays")
                .putExtra(Events.DESCRIPTION, "Tuesday Specials")
                .putExtra(Events.EVENT_LOCATION, "Lixious Bench")
                .putExtra(Events.RRULE, "FREQ=WEEKLY;BYDAY=Tu;UNTIL=20151231")
                .putExtra(Events.DTSTART, calendar.getTimeInMillis())
                .putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, true)
                .putExtra(CalendarContract.Events.HAS_ALARM, 1)
                .putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY);
        startActivity(intent);
    }                               
}

问题:在日历中,它为每个Thursday 显示此事件,而我在代码中使用了“tu

还有一件事,如果我也想为这个事件提供持续时间,比如:from 6:00 pm to 9:00 pm only。

【问题讨论】:

  • 我看到你有一个 RRULE 被注释掉了;当你使用那个时发生了什么?很好奇,因为规范要求 TU 全部大写。
  • @Sun 你用alram manager重复了吗?
  • @Vaishali 我不想用闹钟,我只能用日历来做这个
  • @Sun : alarmmanager 是 Android 的类...因为它有调度时间的功能,根据需要.. 将 week 放入 millisencods 然后重复它.. 它会重复该链每个一周,直到你不停止它

标签: android android-intent calendar android-calendar


【解决方案1】:

你说它显示周四重复,但我得到的是周四的开始日,每周二重复。所以我很确定 RRULE 部分是正确的。

我认为您所要做的就是使用日历设置实际的开始和结束时间以获得正确的毫秒数,然后使用“beginTime”而不是“dtstart”和“endTime”而不是“dtend”。

@Override
public void onClick(View v) {

    // If you want the start times to show up, you have to set them
    Calendar calendar = Calendar.getInstance();

    // Here we set a start time of Tuesday the 17th, 6pm
    calendar.set(2015, Calendar.MARCH, 17, 18, 0, 0);
    calendar.setTimeZone(TimeZone.getDefault());

    long start = calendar.getTimeInMillis();
    // add three hours in milliseconds to get end time of 9pm
    long end = calendar.getTimeInMillis() + 3 * 60 * 60 * 1000;

    Intent intent = new Intent(Intent.ACTION_INSERT)
            .setData(Events.CONTENT_URI)
            .setType("vnd.android.cursor.item/event")
            .putExtra(Events.TITLE, "Tuesdays")
            .putExtra(Events.DESCRIPTION, "Tuesday Specials")
            .putExtra(Events.EVENT_LOCATION, "Lixious Bench")
            .putExtra(Events.RRULE, "FREQ=WEEKLY;BYDAY=TU;UNTIL=20150428")

            // to specify start time use "beginTime" instead of "dtstart"
            //.putExtra(Events.DTSTART, calendar.getTimeInMillis())
            .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, start)
            .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end)

            // if you want to go from 6pm to 9pm, don't specify all day
            //.putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY, true)
            .putExtra(CalendarContract.Events.HAS_ALARM, 1)
            .putExtra(Events.AVAILABILITY, Events.AVAILABILITY_BUSY);

    startActivity(intent);
 }

【讨论】:

  • 而您现在拥有的 RRULE 应该适用于此。您只是将 DTSTART 设置为与星期二部分匹配。试试看!
  • 忘记了末尾的逗号;我手动输入的。查看更新的答案。
  • 是的,刚刚理顺了。开始时间和结束时间的意图键错误。请参阅我的更新答案。
  • 您好,非常感谢您的解决方案,我只是尝试了您的方法,我想说您是大师 :) 但还有一个问题我没有收到任何有关事件的通知...毫无疑问,事件已成功插入,那么我们缺少什么?为什么我们没有收到有关事件的通知...
  • @parik-dhakan 的回答有一些 AlarmManager 的代码,我认为这就是你想要的。显然 HAS_ALARM 列仅用于指示是否设置了警报;你必须自己设置闹钟。干杯
【解决方案2】:

对于星期二,首字母必须全部大写,即。 TU

.putExtra(CalendarContract.Events.RRULE, "FREQ=WEEKLY;BYDAY=TU;UNTIL=20151231")

要为您需要添加的事件指定持续时间

.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME,getMillis(begintime))
.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, getMillis(endtime))

您可以详细了解重复规则herehere

【讨论】:

    【解决方案3】:

    这里我给大家分享一个简单的代码希望对你有所帮助或指导:

    Intent intentAlarm = new Intent(getActivity(), AlarmReceiver.class);
    
    intentAlarm.putExtra("name", data.getName());
    intentAlarm.putExtra("desc", data.getDescription());
    intentAlarm.setData(Uri.parse("custom://" + data.getId()));
    intentAlarm.setAction(String.valueOf(data.getId()));
    
    // Create the AlarmManager
    AlarmManager alarmManager = (AlarmManager) getActivity()
            .getSystemService(Context.ALARM_SERVICE);
    
    // Set the alarm for a particular time
    alarmManager.set(AlarmManager.RTC_WAKEUP, Calendar_Object
            .getTimeInMillis(), PendingIntent.getBroadcast(
                        getActivity(), Integer.parseInt(data.getId()), intentAlarm,
                        PendingIntent.FLAG_UPDATE_CURRENT));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 2019-09-03
      相关资源
      最近更新 更多