В приложении "Шагомер" не работает функция сброса шагов в полночь

Пишу приложение на Андроид по типу шагомера. Достаточно много времени мучаюсь с функцией ежедневного очищения шагов в полночь. Мой функционал не работает, прошу у вас помощи.

Listener:

    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_STEP_COUNTER) {
            SharedPreferences prefs = getSharedPreferences("stats", Context.MODE_PRIVATE);
            float stepsAtMidnight = prefs.getFloat("steps", 0);

            float stepsToday = event.values[0] - stepsAtMidnight;

            if (stepsToday >= 0) {
                dsteps.setText(String.valueOf((int) stepsToday));
                dsteps1.setText(String.valueOf((int) stepsToday));
                float kmm = (stepsToday * 75) / 100000;
                km.setText(String.format("%.1f km", kmm));
                kcal.setText((int)(stepsToday * 0.04) + " kcal");
            }
        }
    }

Alarm:

public void setMidnightResetAlarm(Context context) {
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, StepCounterResetReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        Toast.makeText(context, "Alarm set for midnight", Toast.LENGTH_SHORT).show();

        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_DAY, pendingIntent);
    }

Receiver:

@Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Сброс шагов", Toast.LENGTH_SHORT).show();
        SharedPreferences prefs = context.getSharedPreferences("stats", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();

        float lastSavedSteps = prefs.getFloat("laststeps", 0);
        editor.putFloat("steps", lastSavedSteps);
        editor.apply();
    }

Ответы (1 шт):

Автор решения: Style-7

Чтобы AlarmManager сработал первый раз время в миллисекундах должно быть больше текущего, а вы обнуляя Calendar просто отбрасываете время в прошлое. Поэтому нужно добавить один день.

calendar.add( Calendar.DAY_OF_MONTH, 1 );

Еще в PendingIntentнужно добавить флаг PendingIntent.FLAG_IMMUTABLE (или FLAG_MUTABLE смотрите документацию, но судя по коду первый вариант).

для SDK больше 31 нужно еще проверять разрешение

    if( Build.VERSION.SDK_INT >= 31 ){
        if( alarmManager.canScheduleExactAlarms() ){
        }
    }

и предварительно запрашивать его отдельно через Intent

startActivity( new Intent( ACTION_REQUEST_SCHEDULE_EXACT_ALARM ) );

плюс разрешение в манифесте.

→ Ссылка