Подтвердить что ты не робот

Значок по умолчанию для FCM использует недопустимый градиент

Значок FCM по умолчанию для манифеста Android не используется. Вместо этого используется стандартная иконка Android. В logcat говорится:

E/FirebaseMessaging: значок с идентификатором: 2131230849 использует недопустимый градиент. Использование значка резервного копирования.

Значок по умолчанию содержит только один цвет. Я тестировал его с несколькими значками, но всегда используется значок стандартного Android.

4b9b3361

Ответ 1

UPDATE: исправлено firebase в версии 12.0.0

Код ошибки ниже был обновлен этим, и он отлично работает на 8.0, предотвращая ошибку, изложенную в моем первоначальном ответе.

@TargetApi(26)
private final boolean zza(int var1) {
    if(VERSION.SDK_INT != 26) {
        return true;
    } else {
        try {
            if(this.zzb.getResources().getDrawable(var1, (Theme)null) instanceof AdaptiveIconDrawable) {
                Log.e("FirebaseMessaging", (new StringBuilder(77)).append("Adaptive icons cannot be used in notifications. Ignoring icon id: ").append(var1).toString());
                return false;
            } else {
                return true;
            }
        } catch (NotFoundException var2) {
            return false;
        }
    }
}

Это не решает проблему, но из комментариев меня попросили поставить ее в качестве ответа. Вот код от firebase 11.8.0, который является виновником, и только на Android 8.0 (API 26). Причина этой проверки заключается в том, что есть ошибка уведомлений Android 8.0 с адаптивными значками https://www.bleepingcomputer.com/news/mobile/android-oreo-adaptive-icons-bug-sends-thousands-of-phones-into-infinite-boot-loops/, поэтому этот код предотвращает это, но при этом, также предотвращает неправильное отображение неадаптивных значков

    @TargetApi(26)
private final boolean zzid(int var1) {
    if(VERSION.SDK_INT != 26) {
        return true;
    } else {
        try {
            Drawable var2;
            if((var2 = this.mContext.getResources().getDrawable(var1, (Theme)null)).getBounds().height() != 0 && var2.getBounds().width() != 0) {
                return true;
            } else {
                Log.e("FirebaseMessaging", (new StringBuilder(72)).append("Icon with id: ").append(var1).append(" uses an invalid gradient. Using fallback icon.").toString());
                return false;
            }
        } catch (NotFoundException var3) {
            return false;
        }
    }
}

Я заметил в своем логарифме, что мое приложение дважды набирает этот код за уведомление, оно пытается выполнить мое уведомление, которое я установил в манифесте в соответствии с инструкциями Firebase, а затем снова ударил его, пытаясь сделать это для значка запуска, Оба не работают, даже когда я делаю их сплошными цветными рисунками.

В соответствии с другим комментарием от southrop, команда firebase знает о проблеме и работает над исправлением, но не указала сроки.

Этот код не в 11.6.0 и ниже, поэтому, если вы действительно нуждаетесь в этом, работайте пока, понижайте свою базовую базу.

Надеюсь, что это поможет другим, кто находит это сообщение, ищет ошибку.

Ответ 2

Эта ошибка происходит только в том случае, если ваше приложение ориентировано на API 26 (или выше), и вы используете Firebase 11.8.0 и запускаете его на устройстве с Android 8.0. Поэтому я решил исправить это только для этой версии. Обходной путь: Вы должны переопределить класс приложения и переопределить его getResources(), чтобы вернуть исправленный класс ресурсов:

@Override public Resources getResources() {
    if (resources == null) {
        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O) {
            resources = new ResourcesForSupportFirebaseNotificationsOnAndroid8(super.getResources());
        } else {
            resources = super.getResources();
        }
    }
    return resources;
}

И вы должны создать исправленную для наших целей. Класс ресурсов:

public class ResourcesForSupportFirebaseNotificationsOnAndroid8 extends Resources {

    private final Resources resources;

    public ResourcesForSupportFirebaseNotificationsOnAndroid8(final Resources resources) {
        super(resources.getAssets(), resources.getDisplayMetrics(), resources.getConfiguration());
        this.resources = resources;
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override public Drawable getDrawable(final int id, @Nullable final Theme theme) throws NotFoundException {
        if (id == R.drawable.ic_firebase_notification) {
            final Drawable drawable = resources.getDrawable(id, theme);
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
            return drawable;
        } else {
            return resources.getDrawable(id, theme);
        }
    }
}

И проверьте, что ваш AndroidManifest.xml содержит эти метаданные:

<meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/ic_firebase_notification"
        />

Если вы сделаете так, как описано, все уведомления на Android 8.0, которые будут отображаться Firebase SDK, будут показаны по умолчанию icon @drawable/ic_firebase_notification

Но я надеюсь, что команда Firebase исправит свою вредную проверку и прочитает как это работает

Ответ 4

Какая версия студии Android? Работа студии Android с новой функцией дизайна значков начинается с Android Studio 3.0. Если вы используете Android-версию 3.0 или выше, перейдите в выпадающую папку и вызовите контекстное меню, чтобы добавить новый векторный или графический актив. Найдите вкладку устаревшей, которая является тем же параметром или функцией более ранней версии студии Android.

Ответ 5

Ваш значок должен быть .png с прозрачным фоном, преобразованным из редактора векторной графики (AI, Sketch), или, что лучше, это должно быть .svg Просто попробуйте преобразовать свой значок .png в ресурсы с ресурсом http://romannurik.github.io/AndroidAssetStudio веб-сервис. Он должен помочь решить вашу проблему, или если нет, вам придется перерисовать свой значок.