Добавить еженедельное событие в календарь
Я хотел бы добавить событие в native 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
.
Ответы
Ответ 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);
}
Ответ 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))
Вы можете узнать больше о правиле повторения здесь и здесь
Ответ 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));