From f02d826e94e6858cefef3dcb7f097fc6b550d61f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Schr=C3=B6der?= Date: Fri, 10 Jul 2026 15:05:06 +0200 Subject: [PATCH] fix(android_alarm_manager_plus): catch NullPointerException in AlarmService On Android 11 phones with aggressive battery optimizations (e.g. Huawei and OnePlus), the app might be started in a sandboxed mode when receiving the reboot event. In that sandbox, the resolution of the app's launch class name might fail with a NullPointerException, which in turn leads to a crash. Here is an example stack trace: --------------------------------------------------------------------------- Fatal Exception: java.lang.RuntimeException: Unable to start receiver dev.fluttercommunity.plus.androidalarmmanager.RebootBroadcastReceiver: java.lang.NullPointerException: class name is null at android.app.ActivityThread.handleReceiver(ActivityThread.java:4047) at android.app.ActivityThread.access$1400(ActivityThread.java:239) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1926) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) [...] Caused by java.lang.NullPointerException: class name is null at android.content.ComponentName.(ComponentName.java:103) at android.content.Intent.setClassName(Intent.java:10044) at android.app.ApplicationPackageManager.getLaunchIntentForPackage(ApplicationPackageManager.java:252) at dev.fluttercommunity.plus.androidalarmmanager.AlarmService.createShowPendingIntent(AlarmService.java:362) at dev.fluttercommunity.plus.androidalarmmanager.AlarmService.scheduleAlarm(AlarmService.java:151) at dev.fluttercommunity.plus.androidalarmmanager.AlarmService.reschedulePersistentAlarms(AlarmService.java:338) at dev.fluttercommunity.plus.androidalarmmanager.RebootBroadcastReceiver.onReceive(RebootBroadcastReceiver.java:37) at android.app.ActivityThread.handleReceiver(ActivityThread.java:4038) [...] --------------------------------------------------------------------------- This fix avoids the crash, turning it into a error-log message instead. --- .../plus/androidalarmmanager/AlarmService.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/android_alarm_manager_plus/android/src/main/java/dev/fluttercommunity/plus/androidalarmmanager/AlarmService.java b/packages/android_alarm_manager_plus/android/src/main/java/dev/fluttercommunity/plus/androidalarmmanager/AlarmService.java index 937fcfa7d3..57b4eb9907 100644 --- a/packages/android_alarm_manager_plus/android/src/main/java/dev/fluttercommunity/plus/androidalarmmanager/AlarmService.java +++ b/packages/android_alarm_manager_plus/android/src/main/java/dev/fluttercommunity/plus/androidalarmmanager/AlarmService.java @@ -148,7 +148,13 @@ private static void scheduleAlarm( if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && !manager.canScheduleExactAlarms()) { Log.e(TAG, "Can`t schedule exact alarm due to revoked SCHEDULE_EXACT_ALARM permission"); } else { - PendingIntent showPendingIntent = createShowPendingIntent(context, requestCode, params); + PendingIntent showPendingIntent; + try { + showPendingIntent = createShowPendingIntent(context, requestCode, params); + } catch (NullPointerException ex) { + Log.e(TAG, "Can`t schedule exact alarm because pending intent could not be created.", ex); + return; + } AlarmManagerCompat.setAlarmClock( manager, startMillis, showPendingIntent, pendingIntent);