Значок по умолчанию для FCM использует недопустимый градиент
Значок FCM по умолчанию для манифеста Android не используется. Вместо этого используется стандартная иконка Android.
В logcat говорится:
E/FirebaseMessaging: значок с идентификатором: 2131230849 использует недопустимый градиент. Использование значка резервного копирования.
Значок по умолчанию содержит только один цвет. Я тестировал его с несколькими значками, но всегда используется значок стандартного Android.
Ответы
Ответ 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 исправит свою вредную проверку и прочитает как это работает
Ответ 3
Исправлено с v12.0.0:
https://firebase.google.com/support/release-notes/android#20180320
FIXED Исправлена регрессия, которая вызывала пользовательские значки уведомлений отклонен на Android 8.0.
Ответ 4
Какая версия студии Android? Работа студии Android с новой функцией дизайна значков начинается с Android Studio 3.0. Если вы используете Android-версию 3.0 или выше, перейдите в выпадающую папку и вызовите контекстное меню, чтобы добавить новый векторный или графический актив. Найдите вкладку устаревшей, которая является тем же параметром или функцией более ранней версии студии Android.
Ответ 5
Ваш значок должен быть .png с прозрачным фоном, преобразованным из редактора векторной графики (AI, Sketch), или, что лучше, это должно быть .svg
Просто попробуйте преобразовать свой значок .png в ресурсы с ресурсом http://romannurik.github.io/AndroidAssetStudio веб-сервис. Он должен помочь решить вашу проблему, или если нет, вам придется перерисовать свой значок.