Добавить еженедельное событие в календарь

Я хотел бы добавить событие в собственный 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.


person Sun    schedule 05.03.2015    source источник
comment
Я вижу, вы закомментировали RRULE; что случилось, когда вы использовали это? Любопытно, поскольку спецификация требует, чтобы TU писался в верхнем регистре, как у вас там.   -  person kris larson    schedule 09.03.2015
comment
@ Солнце, ты использовал менеджер alram, чтобы повторить это?   -  person Vaishali Sutariya    schedule 12.03.2015
comment
@Vaishali Я не хочу использовать будильник, я должен делать это только с календарем.   -  person Sun    schedule 12.03.2015
comment
@Sun: alarmmanager - это класс Android ... в котором есть функция планирования времени по желанию ... введите неделю в миллисенкоды, а затем повторите это ... он будет повторять эту цепочку каждую неделю, пока вы не остановите ее   -  person Vaishali Sutariya    schedule 12.03.2015
comment
@Sun: см. javatechig.com/android/repeat-alarm-example-in -андроид   -  person Vaishali Sutariya    schedule 12.03.2015
comment
@Vaishali да, я знаю, и спасибо за ваши усилия, но постарайтесь понять, что это не в моих руках, клиент требует связи с Календарем, и, как вы можете видеть, я достиг 80% своей цели.   -  person Sun    schedule 12.03.2015
comment
Вы пробовали мой обновленный ответ? у меня заработало...   -  person kris larson    schedule 08.06.2015
comment
согласен с @Vaishali, почему нет? Вы можете играть с Alarm Manager неявно, т.е. установить на следующий вторник, и если событие было запущено (BroadcastReceiver), установить снова в следующий вторник... и так далее. Вы можете продолжить этот цикл до декабря 2015 года.   -  person Mohammed Azharuddin Shaikh    schedule 08.06.2015
comment
@hotveryspicy точно .. я хочу сказать то же самое   -  person Vaishali Sutariya    schedule 08.06.2015


Ответы (3)


Вы сказали, что это показывало повторение для четверга, но то, что я получил, было начальным днем ​​четверга с повторением каждый вторник. Так что я почти уверен, что часть 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);
 }
person kris larson    schedule 09.03.2015
comment
И ПРАВИЛО, которое у вас есть прямо сейчас, должно работать именно для этого. Вы просто устанавливаете DTSTART для соответствия части вторника. Попробуйте! - person kris larson; 09.03.2015
comment
Забыл запятую в конце; Я ввел его вручную. Смотрите обновленный ответ. - person kris larson; 09.03.2015
comment
Да, только что выровнял. Ключ намерения был неправильным для времени начала и времени окончания. Смотрите мой обновленный ответ. - person kris larson; 13.03.2015
comment
привет, большое спасибо за ваше решение, я только что попробовал ваш способ, и я хотел бы сказать, что вы мастер :) но все же есть одна проблема, я не получил никакого уведомления о событии... без сомнения, событие было успешно вставлено, Итак, чего нам не хватает? Почему мы не получаем уведомление о событии... - person Sun; 01.07.2015
comment
В ответе @parik-dhakan есть код для AlarmManager, я думаю, это то, что вы хотите. По-видимому, столбец HAS_ALARM предназначен только для указания того, был ли установлен аварийный сигнал или нет; Вы должны сделать настройку будильника самостоятельно. Ваше здоровье - person kris larson; 01.07.2015

Для вторника все инициалы должны быть заглавными, т.е. 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))

Вы можете узнать больше о правиле повторения здесь и здесь

person lil'ms    schedule 08.06.2015

Здесь я делюсь с вами простым кодом, который поможет вам или направит вас:

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));
person parik dhakan    schedule 08.06.2015