2015-03-05 4 views
16

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

+0

Я вижу, у вас есть RRULE закомментирована; что случилось, когда вы использовали этот? Любопытно, поскольку спецификация требует TU всех прописных букв, как вы там. –

+0

@Sun вы используете менеджера alram, чтобы повторить его? –

+0

@Vaishali Я не хочу использовать Alarm, я должен делать это только с Calendar – Sun

ответ

3

Вы сказали, что он показал повторение в четверг, но то, что я получил, было днем ​​начала четверга с повторением каждый вторник. Поэтому я уверен, что часть RRULE верна.

Я думаю, что все, что вам нужно сделать, это установить фактическое время начала и окончания с помощью Календаря, чтобы получить правильные миллисекунды, а затем вместо «dtend» вместо «dtstart» и «endTime» вместо пользователя «начать» вместо «dtstart» вместо «dtstart».

@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); 
} 
+0

И RRULE, который у вас есть сейчас, должен работать правильно. Вы просто устанавливаете DTSTART в соответствии со частью вторника. Попробуйте! –

+0

Забыл запятую в конце; Я набрал его вручную. См. Обновленный ответ. –

+0

Да, только что выпрямился. Ключ намерения был неправильным для времени начала и окончания. См. Мой обновленный ответ. –

0

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

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)); 
1

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

Вы можете узнать больше о правиле recurrance here и here

Смежные вопросы