Ошибка при получении сериализованного объекта из интента. Failure filling in extras
Я пишу будильник на kotlin. Когда я передаю объект любого класса через интент (put extra), чтобы при срабатывании Alarm Manager (в классе Alarm Receiver), этот объект был принят, то возникает ошибка (Failure filling in extras) и вместо объекта принимается null. Класс объекта. Сам класс (в примере это класс Clock) реализует Serializable, класс используется во многих местах (он рабочий) и он является data классом. Я пробовал передавать другие объекты, но возникает та же ошибка.
Ошибка:
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.passwordalarmclock.Clock" on path: DexPathList[[zip file "/system/framework/services.jar", zip file "/system/framework/ethernet-service.jar", zip file "/system/framework/wifi-service.jar"],nativeLibraryDirectories=[/system/lib, /vendor/lib, /system/lib, /vendor/lib]]
Более полный trace:
Failure filling in extras
java.lang.RuntimeException: Parcelable encountered ClassNotFoundException reading a Serializable object (name = com.example.passwordalarmclock.Clock)
at android.os.Parcel.readSerializable(Parcel.java:2615)
at android.os.Parcel.readValue(Parcel.java:2415)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2717)
at android.os.BaseBundle.unparcel(BaseBundle.java:269)
at android.os.Bundle.putAll(Bundle.java:226)
at android.content.Intent.fillIn(Intent.java:8171)
at com.android.server.am.PendingIntentRecord.sendInner(PendingIntentRecord.java:255)
at com.android.server.am.PendingIntentRecord.sendWithResult(PendingIntentRecord.java:216)
at com.android.server.am.ActivityManagerService.sendIntentSender(ActivityManagerService.java:7181)
at android.app.PendingIntent.send(PendingIntent.java:836)
at com.android.server.AlarmManagerService$DeliveryTracker.deliverLocked(AlarmManagerService.java:2989)
at com.android.server.AlarmManagerService.deliverAlarmsLocked(AlarmManagerService.java:2429)
at com.android.server.AlarmManagerService$AlarmThread.run(AlarmManagerService.java:2548)
Caused by: java.lang.ClassNotFoundException: com.example.passwordalarmclock.Clock
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:400)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:626)
at android.os.Parcel$2.resolveClass(Parcel.java:2606)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1772)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
at android.os.Parcel.readSerializable(Parcel.java:2609)
at android.os.Parcel.readValue(Parcel.java:2415)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2717)
at android.os.BaseBundle.unparcel(BaseBundle.java:269)
at android.os.Bundle.putAll(Bundle.java:226)
at android.content.Intent.fillIn(Intent.java:8171)
at com.android.server.am.PendingIntentRecord.sendInner(PendingIntentRecord.java:255)
at com.android.server.am.PendingIntentRecord.sendWithResult(PendingIntentRecord.java:216)
at com.android.server.am.ActivityManagerService.sendIntentSender(ActivityManagerService.java:7181)
at android.app.PendingIntent.send(PendingIntent.java:836)
at com.android.server.AlarmManagerService$DeliveryTracker.deliverLocked(AlarmManagerService.java:2989)
at com.android.server.AlarmManagerService.deliverAlarmsLocked(AlarmManagerService.java:2429)
at com.android.server.AlarmManagerService$AlarmThread.run(AlarmManagerService.java:2548)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.passwordalarmclock.Clock" on path: DexPathList[[zip file "/system/framework/services.jar", zip file "/system/framework/ethernet-service.jar", zip file "/system/framework/wifi-service.jar"],nativeLibraryDirectories=[/system/lib, /vendor/lib, /system/lib, /vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:400)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:626)
at android.os.Parcel$2.resolveClass(Parcel.java:2606)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1772)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
at android.os.Parcel.readSerializable(Parcel.java:2609)
at android.os.Parcel.readValue(Parcel.java:2415)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2717)
at android.os.BaseBundle.unparcel(BaseBundle.java:269)
at android.os.Bundle.putAll(Bundle.java:226)
at android.content.Intent.fillIn(Intent.java:8171)
at com.android.server.am.PendingIntentRecord.sendInner(PendingIntentRecord.java:255)
at com.android.server.am.PendingIntentRecord.sendWithResult(PendingIntentRecord.java:216)
at com.android.server.am.ActivityManagerService.sendIntentSender(ActivityManagerService.java:7181)
at android.app.PendingIntent.send(PendingIntent.java:836)
at com.android.server.AlarmManagerService$DeliveryTracker.deliverLocked(AlarmManagerService.java:2989)
at com.android.server.AlarmManagerService.deliverAlarmsLocked(AlarmManagerService.java:2429)
at com.android.server.AlarmManagerService$AlarmThread.run(AlarmManagerService.java:2548)
Класс:
package com.example.passwordalarmclock
import java.io.Serializable
data class Clock(
var id: Long? = null,
var isActive: Boolean = true,
var withPassword: Boolean = false,
var alarmRepeatingMode: AlarmRepeatingMode = AlarmRepeatingMode.ONETIME,
var triggeringHour: Int = 0,
var triggeringMinute: Int = 0,
var triggeringWeekDays: Int? = null,
var name: String? = null,
var password: String? = null
) : Serializable{
fun getTriggeringWeekDaysInAbbreviatedStringFormat() : String{
if(triggeringWeekDays == null) return ""
var daysInString = ""
if ((triggeringWeekDays!! and 0b0000001) != 0) daysInString += MyApplication.getAppContext().getString(R.string.Mon) + " "
if ((triggeringWeekDays!! and 0b0000010) != 0) daysInString += MyApplication.getAppContext().getString(R.string.Tue) + " "
if ((triggeringWeekDays!! and 0b0000100) != 0) daysInString += MyApplication.getAppContext().getString(R.string.Wed) + " "
if ((triggeringWeekDays!! and 0b0001000) != 0) daysInString += MyApplication.getAppContext().getString(R.string.Thu) + " "
if ((triggeringWeekDays!! and 0b0010000) != 0) daysInString += MyApplication.getAppContext().getString(R.string.Fri) + " "
if ((triggeringWeekDays!! and 0b0100000) != 0) daysInString += MyApplication.getAppContext().getString(R.string.Sat) + " "
if ((triggeringWeekDays!! and 0b1000000) != 0) daysInString += MyApplication.getAppContext().getString(R.string.Sun) + " "
return daysInString
}
fun getTimeInStringFormat(): String = "$triggeringHour:$triggeringMinute"
}
enum class AlarmRepeatingMode(val value: Int): Serializable {
EVERYDAY(1),
ONETIME(2),
SELECTDAYS(3);
companion object {
fun fromValue(alarmRepeatingMode: Int): AlarmRepeatingMode {
return values().firstOrNull { it.value == alarmRepeatingMode }
?: throw IllegalArgumentException("Несоответствующее значение для AlarmRepeatingMode")
}
}
}
Более простой класс, с которым возникает та же ошибка:
package com.example.passwordalarmclock
import java.io.Serializable
data class IntentTest(val testInt: Int): Serializable {}
Манифест:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<!--android:theme="@style/Theme.PasswordAlarmClock"-->
<!--MyApplication - мой класс для обработки запуска и завершения приложения-->
<!--android:theme="@style/MyTheme" Нужно было для попытки передавать в Dialog Alerts контекст приложения, а не контекст активити. Итог: не помогло-->
<application
android:name=".MyApplication"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Base.Theme.PasswordAlarmClock"
tools:targetApi="31">
<!-- Объявление неубиваемого сервиса для точных уведомлений-->
<service
android:name=".AlarmService"
android:enabled="true"
android:exported="true" />
<receiver
android:name=".AlarmReceiver"
android:enabled="true"
android:exported="true" />
<activity
android:name=".MainActivity"
android:exported="true">
</activity>
<activity
android:name=".ClockSettingActivity"
android:exported="false">
</activity>
<activity
android:name=".SettingsActivity"
android:exported="true">
</activity>
<!-- android:windowSoftInputMode="stateHidden" используется для предотвращения автоматического появления клавиатуры (из-за использования невидимой зоны для поля для ввода)-->
<activity
android:name=".LockScreenActivity"
android:exported="true"
android:windowSoftInputMode="stateHidden">
<!--Этот блок делает активити стартовой-->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Создание интента (в классе AlarmManager):
val alarmIntent = Intent(context, AlarmReceiver::class.java).apply {
action = "ACTION_START_ALARM"
putExtra("clock", clock)
var box = "box"
putExtra("box", box)
putExtra("test", IntentTest(4))
}
val pendingIntent = PendingIntent.getBroadcast(context, clock.id!!.toInt(), alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT)
alarmManager?.setExact(
AlarmManager.RTC_WAKEUP,
calendar.timeInMillis,
pendingIntent
)
Приём интента (в классе AlarmReceiver):
val intentClock = intent.getSerializableExtra("clock") as? com.example.passwordalarmclock.Clock