Search code examples
androidflutterdartonesignalandroid-13

Flutter app crashes when initialize OneSignal on android 13


My app is crashes/terminate when try to init or setAppId id for OneSignal

flutter doctor

> Doctor summary (to see all details, run flutter doctor -v): [√]
> Flutter (Channel stable, 3.3.8, on Microsoft Windows [Version
> 10.0.19045.2251], locale en-US) Checking Android licenses is taking an unexpectedly long time...[√] Android toolchain - develop for Android
> devices (Android SDK version 30.0.3) [√] Chrome - develop for the web
> [X] Visual Studio - develop for Windows
>     X Visual Studio not installed; this is necessary for Windows development.
>       Download at https://visualstudio.microsoft.com/downloads/.
>       Please install the "Desktop development with C++" workload, including all of its default components [√] Android Studio (version
> 2021.3) [√] VS Code (version 1.73.1) [√] Connected device (4 available) [√] HTTP Host Availability

I'm use last version from OneSignal

 onesignal_flutter: ^3.5.0

and use last compileSdkVersion

compileSdkVersion 33

here my flutter code

static void _initOneSignal() async {
    // The promptForPushNotificationsWithUserResponse function will show the iOS push notification prompt. We recommend removing the following code and instead using an In-App Message to prompt for notification permission
    await OneSignal.shared
        .promptUserForPushNotificationPermission(fallbackToSettings: true);

    //Remove this method to stop OneSignal Debugging
    if (kDebugMode)
      OneSignal.shared.setLogLevel(OSLogLevel.verbose, OSLogLevel.none);

    OneSignal.shared.setAppId("${AppConstant.oneSignalId}");

// The promptForPushNotificationsWithUserResponse function will show the iOS push notification prompt. We recommend removing the following code and instead using an In-App Message to prompt for notification permission
    OneSignal.shared.promptUserForPushNotificationPermission().then((accepted) {
      debugPrint("Accepted permission: $accepted");
    });
  }

NOTE : when run app without calling _initOneSignal() function, application work normally

when try to run app on android 13 throw this error and app closed

E/AndroidRuntime(11728): FATAL EXCEPTION: main
E/AndroidRuntime(11728): Process: com.band.amazfitband7, PID: 11728
E/AndroidRuntime(11728): java.lang.ExceptionInInitializerError
E/AndroidRuntime(11728):    at com.onesignal.OneSignal.promptForPushNotifications(OneSignal.java:2864)
E/AndroidRuntime(11728):    at com.onesignal.flutter.OneSignalPlugin.promptPermission(OneSignalPlugin.java:282)
E/AndroidRuntime(11728):    at com.onesignal.flutter.OneSignalPlugin.onMethodCall(OneSignalPlugin.java:158)
E/AndroidRuntime(11728):    at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:262)
E/AndroidRuntime(11728):    at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:295)
E/AndroidRuntime(11728):    at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:319)
E/AndroidRuntime(11728):    at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(Unknown Source:12)
E/AndroidRuntime(11728):    at android.os.Handler.handleCallback(Handler.java:942)
E/AndroidRuntime(11728):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(11728):    at android.os.Looper.loopOnce(Looper.java:201)
E/AndroidRuntime(11728):    at android.os.Looper.loop(Looper.java:288)
E/AndroidRuntime(11728):    at android.app.ActivityThread.main(ActivityThread.java:7872)
E/AndroidRuntime(11728):    at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(11728):    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
E/AndroidRuntime(11728):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
E/AndroidRuntime(11728): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
E/AndroidRuntime(11728):    at com.onesignal.OSUtils.getTargetSdkVersion(OSUtils.java:490)
E/AndroidRuntime(11728):    at com.onesignal.NotificationPermissionController.<clinit>(NotificationPermissionController.kt:48)

Solution

  • The application crashes if you call methods during initialization in the following sequence:

    OneSignal.shared.setLogLevel(config.logLevel, config.visualLevel);
    OneSignal.shared.promptUserForPushNotificationPermission(fallbackToSettings: true);
    OneSignal.shared.setAppId(config.appId);
    

    Method calls must be clearly in this order to solve the problem:

    OneSignal.shared.setLogLevel(config.logLevel, config.visualLevel);
    OneSignal.shared.setAppId(config.appId);
    OneSignal.shared.promptUserForPushNotificationPermission(fallbackToSettings: true);