В приложении "Шагомер" не работает функция сброса шагов в полночь
Пишу приложение на Андроид по типу шагомера. Достаточно много времени мучаюсь с функцией ежедневного очищения шагов в полночь. Мой функционал не работает, прошу у вас помощи.
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 ) );
плюс разрешение в манифесте.