Search code examples
androidalarmmanager

Alarm fireing too early


I'm trying to make an alarm for notification.

The problem I'm facing is that it's firing the notification too early...

I really need to get the date and time from date and time picker.

I have no clue whats wrong with my code. Here's is my code:

MainActivity.java

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fire = findViewById(R.id.fire);
        choose = findViewById(R.id.choose);

        choose.setOnClickListener(new View.OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.N)
            @Override
            public void onClick(View view) {
                final Calendar cal = getInstance();
                int year = cal.get(YEAR);
                int month = cal.get(MONTH);
                int day = cal.get(DAY_OF_MONTH);

                final DatePickerDialog dialog = new DatePickerDialog(
                        MainActivity.this,
                        R.style.Theme_AppCompat_Light,
                        mDataSetListener,
                        year,month,day
                );

                dialog.setOnDateSetListener(new DatePickerDialog.OnDateSetListener() {
                    @Override
                    public void onDateSet(DatePicker datePicker, final int year, final int day, final int month) {
                        final Calendar calTime = getInstance();
                        int hour = calTime.get(Calendar.HOUR_OF_DAY);
                        int minute = calTime.get(Calendar.MINUTE);

                        final String datum = day + "." + month + "." + year;

                        TimePickerDialog timePickerDialog = new TimePickerDialog(MainActivity.this,R.style.Theme_AppCompat_Light, new TimePickerDialog.OnTimeSetListener() {

                            @Override
                            public void onTimeSet(TimePicker timePicker, int hour, int minute) {

                                final Calendar cal_new = getInstance();
                                cal_new.set(Calendar.YEAR,year);
                                cal_new.set(Calendar.MONTH,month-1);
                                cal_new.set(Calendar.DAY_OF_MONTH,day);

                                cal_new.set(Calendar.HOUR_OF_DAY,hour);
                                cal_new.set(Calendar.MINUTE,minute);


                                Toast.makeText(MainActivity.this,day + " " + month + " " + year + " " + hour + ":" + minute, Toast.LENGTH_SHORT).show();
                                AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                                Intent in = new Intent(MainActivity.this,Alarm.class);
                                PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this,0,in,0);
                                alarmManager.setExact(AlarmManager.RTC_WAKEUP, cal_new.getTimeInMillis(),pi);
                            }
                        },hour,minute,true);
                        timePickerDialog.show();
                    }
                });
                dialog.show();

            }
        });

Alarm.java (BroadCastReceiver)

public class Alarm extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Yeah", Toast.LENGTH_SHORT).show();
        try {
            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            Ringtone r = RingtoneManager.getRingtone(context, notification);
            r.play();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

I tried some solutions but it didn't help.

Thanks!


Solution

  • The problem is that you are setting month-1 expecting to get values from 1 to 12. The month at onDateChanged already are 0 to 11 for compatibility with Calendar.

    There is no need to modify the month you get, set it to the alarm manager like this:

    cal_new.set(Calendar.MONTH, month);
    

    Check DatePickerDiaglo doc.