#java #android #android-studio
Вопрос:
Я разрабатываю приложение, которое планирует напоминания (уведомления и / или сигналы тревоги) с помощью AlarmManager, поскольку пользователь может создавать большое количество напоминаний, я решил, что, когда пользователь добавляет напоминание, оно не должно быть запланировано с помощью AlarmManager, а добавлено в базу данных SQLite и добавлено в AlarmManager в день, когда оно должно зазвонить, я использовал это приложение.:
Intent intent = new Intent(context, AlarmReceiver.class);
intent.setAction("ACTIVATOR");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarm.cancel(pendingIntent);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cHoraActivacion.getTimeInMillis(), (24 * 60 * 60 * 1000), pendingIntent);
Это заставит «АКТИВАТОР» активироваться каждый день в 00:00, чтобы активировать напоминания о дне с помощью AlarmManager:
@Override
public void onReceive(Context context, Intent intent) {
if (appDataBase == null){
appDataBase = Room.databaseBuilder(context, AppDataBase.class, Constant.DB_NAME)
.allowMainThreadQueries()
.build();
}
String action = intent.getAction();
if (action != null amp;amp; context != null) {
if("ACTIVATOR".equals(action)) {
activateDayAlarm(context);
activateClassOfDayReminders(context, appDataBase);
activateDayScheduleReminders(context, appDataBase);
}
На Samsung J2 с Android 8.1 это работает нормально, но вот что показывает мне PlayConsole:
java.lang.RuntimeException:
at android.app.ActivityThread.handleReceiver (ActivityThread.java:4452)
at android.app.ActivityThread.access$1600 (ActivityThread.java:301)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2159)
at android.os.Handler.dispatchMessage (Handler.java:106)
at android.os.Looper.loop (Looper.java:246)
at android.app.ActivityThread.main (ActivityThread.java:8506)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1130)
Caused by: java.lang.IllegalStateException:
at androidx.room.RoomOpenHelper.onUpgrade (RoomOpenHelper.java:117)
at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onUpgrade (FrameworkSQLiteOpenHelper.java:177)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked (SQLiteOpenHelper.java:489)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase (SQLiteOpenHelper.java:387)
at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase (FrameworkSQLiteOpenHelper.java:145)
at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase (FrameworkSQLiteOpenHelper.java:106)
at androidx.room.RoomDatabase.inTransaction (RoomDatabase.java:476)
at androidx.room.RoomDatabase.assertNotSuspendingTransaction (RoomDatabase.java:281)
at com.package.name.crud.ReminderDao_Impl.listIdsRemindersOfDay (ReminderDao_Impl.java:270)
at com.package.name.AlarmReceiver.activateDayScheduleReminders (AlarmReceiver.java:360)
at com.package.name.AlarmReceiver.onReceive (AlarmReceiver.java:65)
at android.app.ActivityThread.handleReceiver (ActivityThread.java:4443)
Вчера я загрузил обновление, и оно произошло с 26 пользователями (Android 8, 8.1, 9, 10, 11)
В тревожном получателе:
static void activateDayScheduleReminders(Context context, AppDataBase appDataBase){
long idSemester = MySettings.getCurrentSemester(context);
String hour = new SimpleDateFormat("HH:mm").format(new Date());
List<Integer> idsRemindersOfDay = appDataBase.reminderDao().listIdsRemindersOfDay(idSemester, dateToday(), hour);
for (int i = 0; i < idsRemindersOfDay.size(); i ){
int idReminder = idsRemindersOfDay.get(i);
String[] hourReminder = appDataBase.reminderDao().getHourReminder(idReminder).split(":");
int hourR = Integer.parseInt(hourReminder[0]);
int minuteR = Integer.parseInt(hourReminder[1]);
Calendar cDateReminder = Calendar.getInstance();
cDateReminder.set(Calendar.HOUR_OF_DAY, hourR);
cDateReminder.set(Calendar.MINUTE, minuteR);
cDateReminder.set(Calendar.SECOND, 0);
cDateReminder.set(Calendar.MILLISECOND, 0);
if (cDateReminder.after(Calendar.getInstance()))
NotificationScheduler.setScheduleReminder(context, idReminder, cDateReminder);
}
}
360 line is:
List<Integer> idsRemindersOfDay = appDataBase.reminderDao().listIdsRemindersOfDay(idSemester, dateToday(), hour);
In ReminderDao
@Query("SELECT Reminder._id FROM Remindern"
"INNER JOIN Event ON Reminder.id_event_rc=Event._idn"
"INNER JOIN Semester ON Event.id_semester_ev=Semester._idn"
"WHERE Semester._id=:idSemestern"
"AND Reminder.date = :daten"
"AND Reminder.hour>=:hourn"
"ORDER BY Reminder.hour")
List<Integer> listIdsRemindersOfDay(long idSemester, String date, String hour);
dateToday():
static String dateToday(){
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
return dateFormat.format(date);
}
I have investigated but I can not find the problem, I hope you can help me