EddyVerbruggen / Toast-PhoneGap-Plugin

:beers: A Toast popup plugin for your fancy Cordova app
MIT License
510 stars 276 forks source link

null pointer exceptions in android 11 #136

Open cosmopolit opened 3 years ago

cosmopolit commented 3 years ago

Since Android 11, custom toasts/ toast modifications are deprecated, according to Google to "protect users". Hence why your app in Android 30 is not able to display custom toasts.

From Android Developers documentation:

Custom toast views are deprecated. Apps can create a standard text toast with the makeText(android.content.Context, java.lang.CharSequence, int)

claytonsyspan commented 3 years ago

I am with problem with the plugin. It close my apps after display the message. What is the solution? Just in devices using android 11.

drewrygh commented 3 years ago

Toast.getView() returns null on API Level 30+. As a temporary workaround, it's possible to add null checks before any calls that expect Toast.getView to return a View object. This styling block in Toast.java relies on the custom Toast View. To prevent crashes, it's possible to add a check that will exclude the block from running on API 30+, eg:

Toast.java

if (styling != null && Build.VERSION.SDK_INT >= 16 && Build.VERSION.SDK_INT < 30) { ... }

This is a temporary fix to prevent crashing, though it prevents styling from being applied to toasts on Android 11+.

@EddyVerbruggen what is the recommended approach for styling toasts going forward? The Toast docs mention using Snackbar— is this something you think would be within the scope of this plugin? This seems like an important issue to resolve since Android 11 is gaining marketshare quickly.

almothafar commented 3 years ago

I got the same issue for my users, Crashlytics reports a lot of crashes recently because of this:

image

@EddyVerbruggen I think this is critical

almothafar commented 3 years ago

@drewrygh there is other lines Here too https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin/blob/master/src/android/nl/xservices/plugins/Toast.java#L163

claytonsyspan commented 3 years ago

@EddyVerbruggen what do you think about a new version of this plugin?

EddyVerbruggen commented 3 years ago

Oh dear! Happy to merge a PR (I might have missed one?)

gabn88 commented 3 years ago

Would love to see this merged :)

zommerfelds commented 3 years ago

Is there a workaround for this? I don't need any styling, but just calling showShortBottom is making my app crash once I touch on the screen after a toast.

E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.view.View.isShown()' on a null object reference

almothafar commented 3 years ago

@zommerfelds at this point, I think the only workaround for this is just giving up Cordova and go flutter, Cordova is dying

Anyways, seriously, I think the only way now is just to fork and solve the issue and install the plugin from your repo, you can merge any PR you want as these PRs are already sent.

gabn88 commented 3 years ago

@zommerfelds We just started to show the toast alerts with javascript instead of through cordova for Android. There are many toast like javascript packages on npm, but it is also fairly simple to create your own.

@almothafar I'm also following flutter, but since it cannot be (reliably) used on the web I see it as a different tool, not perse a substitute for Cordova/ionic. But that's a different discussion ;)

almothafar commented 3 years ago

@gabn88 I'm using Ionic toast as well https://ionicframework.com/docs/api/toast instead of native toast, I removed the native one from my side because of this issue.

123dma commented 3 years ago

The solution @dpa99c works. Add this changes https://github.com/dpa99c/Toast-PhoneGap-Plugin/commit/7a6120142e156a156e04301016abe3b35ec94cbb

and I need to add the condition (if (Build.VERSION.SDK_INT >= 30) {) to work api less 30

if (Build.VERSION.SDK_INT >= 30) { toast.addCallback(new android.widget.Toast.Callback() { public void onToastShown() {

      }

      public void onToastHidden() {
        returnTapEvent("hide", msg, data, callbackContext);
      }
    });

}

tested = api 31, 30 ,29, 28, 27 ... 23

geshub commented 3 years ago

Would be great to update the plugin for Android 11