Установите AlarmManager из DatePicker и TimePicker

Я очень застрял в создании будильника из DatePicker и TimePicker...

Это код моей попытки:

Calendar cal=Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth());
cal.set(Calendar.MONTH, datePicker.getMonth());
cal.set(Calendar.YEAR, datePicker.getYear());
cal.set(Calendar.HOUR, timePicker.getCurrentHour());
cal.set(Calendar.MINUTE, timePicker.getCurrentMinute());        
long millis=cal.getTimeInMillis();

Intent intent=new Intent(CalendarView.this,AvisoReceiver.class);
PendingIntent mAlarmSender=PendingIntent.getBroadcast(CalendarView.this,23454546, intent,0);
AlarmManager alm=(AlarmManager)getSystemService(ALARM_SERVICE);
alm.set(AlarmManager.RTC_WAKEUP, millis,mAlarmSender);      

Но когда я устанавливаю будильник из TimePicker и DatePicker, мой приемник не вызывается.

Если я ставлю будильник через 3 секунды после звонка получателя и получаю уведомление.


person Rafael Carrillo    schedule 13.05.2012    source источник
comment
Я думаю, что я решил это сейчас.   -  person Sam    schedule 14.05.2012
comment
я решил временно вычесть 12 часов, хе-хе-хе .. я знаю, что это не лучшее решение, но я все еще работаю.   -  person Rafael Carrillo    schedule 14.05.2012


Ответы (1)


Переписать

Поэтому, когда я программирую в 2 часа ночи, я не всегда на высоте. Вот две поправки, которые нужно добавить в код, чтобы получить ожидаемое поведение (24/7):

cal.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour());
cal.set(Calendar.SECOND, 0);

Используйте HOUR_OF_DAY, чтобы прочитать 24-часовое время, и SECOND, чтобы установить секунды на :00. HOUR считывает только 12-часовое время, поэтому он работал в 2 часа ночи, а не в 7 вечера, и почему он был отключен на 43000 секунд (12 часов). Без установки SECOND объекта Calendar он будет переносить текущие минуты на секунду, создавая непредвиденную задержку.

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

cal.set(datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth(), timePicker.getCurrentHour(), timePicker.getCurrentMinute(), 0);

В любом случае, все, что вам нужно позвонить, это:

alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), mAlarmSender);      

(Нет, требуется больше причудливой математики, как в моем первом предложении.) Надеюсь, это поможет!

person Sam    schedule 13.05.2012
comment
ОМГ спасибо! , но я все еще мгновенно уведомляюсь, когда ставлю будильник :/ - person Rafael Carrillo; 14.05.2012
comment
я получаю это значение в журнале: Разница: -43242 - person Rafael Carrillo; 14.05.2012
comment
текущее время 22:53, и я пытаюсь установить будильник на 22:54 или 22:55, даже если я поставлю на 23:55, я получаю мгновенное уведомление - person Rafael Carrillo; 14.05.2012
comment
Подождите, похоже, что это ровно месяц назад... Вы используете DatePicker по умолчанию? - person Sam; 14.05.2012
comment
да, я не использую внешние виджеты - person Rafael Carrillo; 14.05.2012
comment
Хм, я получаю те же различия. Я знаю, что это сработало прошлой ночью. ... Чего нам не хватает? - person Sam; 14.05.2012
comment
когда я ставлю будильник в этот день на 23:17 (23:15), он работает, но я должен выбрать AM, а не PM - person Rafael Carrillo; 14.05.2012
comment
я использую конвертер миллисекунд в дату, а использование PM добавляет 12 часов ко времени - person Rafael Carrillo; 14.05.2012
comment
Я думал об этом прошлой ночью... Также я обнаружил, что вы можете сделать cal.set(Calendar.SECOND, 0); Это может помочь. - person Sam; 14.05.2012
comment
К сожалению, сейчас мне нужно приготовить ужин. Если вы не найдете решение сначала, я решу это позже. - person Sam; 14.05.2012
comment
Хорошо, без проблем, спасибо!! :D я буду работать над этой проблемой - person Rafael Carrillo; 14.05.2012
comment
давайте продолжим обсуждение в чате - person Sam; 14.05.2012