Android Toastは使うべきではない

f:id:QoopMk:20191107160955p:plain

developer.android.com

つい最近 Toast が表示されないというバグを見つけたので共有します。

AndroidのIssueにも起票されていました。

https://issuetracker.google.com/issues/36951147

端末の設定で通知をOFFにしてしまっていると発生します。

Toastを表示させる関数を見てみると、通知が有効になっているかの判定を行なってしまっているようです。

areNotificationsEnabledForPackageInt の部分。

public void enqueueToast(String pkg, ITransientNotification callback, int duration)
    {
        if (DBG) Slog.i(TAG, "enqueueToast pkg=" + pkg + " callback=" + callback + " duration=" + duration);

        if (pkg == null || callback == null) {
            Slog.e(TAG, "Not doing toast. pkg=" + pkg + " callback=" + callback);
            return ;
        }

        final boolean isSystemToast = ("android".equals(pkg));

        // ここが問題
        if (ENABLE_BLOCKED_TOASTS && !isSystemToast && !areNotificationsEnabledForPackageInt(pkg)) {
            Slog.e(TAG, "Suppressing toast from package " + pkg + " by user request.");
            return;
        }
        ....略
    }

補足

現在はすでに修正されているので、Android10では発生しないようですが、いずれにせよ下位バージョンを対応させることのほうが多いので、SnackBarやアラートなどで代替したほうがよさそうです。

https://android.googlesource.com/platform/frameworks/base.git/+blame/f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8/services/java/com/android/server/NotificationManagerService.java#660