【问题标题】:FCM default icon uses invalid gradientFCM 默认图标使用无效渐变
【发布时间】:2018-06-16 16:37:40
【问题描述】:

未使用 Android 清单的默认 FCM 图标。而是使用 Android 标准图标。 在 logcat 中它说:

E/FirebaseMessaging:ID 为 2131230849 的图标使用了无效的渐变。使用后备图标。

默认图标只包含一种颜色。我使用多个不同的图标对其进行了测试,但始终使用 Android 标准图标。

【问题讨论】:

  • firebase-messaging:11.6.0 未发生 FWIW(版本 11.8.0 发生)。
  • 我将此作为错误报告提交给带有 MCVE 的 Firebase 团队,他们已经确认了该问题。等着看他们有没有解决办法。当我听到时会报告。
  • @ozbek 不幸的是,我并没有解决这个问题。我不确定他们是否可以在服务器端修复它;这似乎是 SDK 端的处理问题。大约半小时前,我收到了 Firebase 团队的回复,说他们正在调查此事。
  • 找到了代码,这里是 firebase 11.8.0 所做的检查,仅当 SDK != 26` Drawable var2; if((var2 = this.mContext.getResources().getDrawable(var1, (Theme)null)).getBounds().height() != 0 && var2.getBounds().width() != 0) { 返回真的; } else { Log.e("FirebaseMessaging", (new StringBuilder(72)).append("Icon with id: ").append(var1).append(" 使用无效渐变。使用后备图标。").toString ());返回假; }`
  • 11 小时前,我从 djxstream 向 Firebase 团队发送了代码 sn-p 后收到一封电子邮件:“我们的工程师目前正在解决这个问题,但我无法分享任何目前有关修复何时向公众提供的详细信息或时间表。”希望尽快发布,但在那之前我认为我们无能为力。

标签: android firebase firebase-cloud-messaging


【解决方案1】:

更新:由 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;
        }
    }
}

这并不能解决问题,但是从 cmets 中,我被要求将其作为答案。这是来自 firebase 11.8.0 的代码,它是罪魁祸首,并且仅在 Android 8.0 (API 26) 上。进行此检查的原因是因为存在带有自适应图标https://www.bleepingcomputer.com/news/mobile/android-oreo-adaptive-icons-bug-sends-thousands-of-phones-into-infinite-boot-loops/ 的 Android 8.0 通知错误,因此此代码可以防止这种情况发生,但这样做也可以防止非自适应图标正确显示

    @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;
        }
    }
}

我在我的 logcat 中注意到,我的应用程序每次通知都会点击此代码两次,它会尝试根据 Firebase 的说明在清单中设置我的可绘制通知,然后再次点击它以尝试为启动器图标执行此操作.两者都失败了,即使我将它们制作为纯色可绘制对象。

根据 southrop 的另一条评论,firebase 团队已意识到该问题并正在努力修复,但没有给出时间表。

此代码不在 11.6.0 及更低版本中,因此如果您暂时确实需要此代码,请降级您的 Firebase。

希望这可以帮助找到此帖子搜索错误的其他人

【讨论】:

  • 我在旧版 Firebase 上遇到了同样的问题。我的应用程序有 2 种不同图标的风格,第一种风格失败并使用后备图标,第二种显示通知图标就好了。但是,我无法理解为什么。
  • 我找到了这个解决方案,可以避免使用 SDK (27) 在 Android O 上后台应用程序中出现白色方块。stackoverflow.com/a/48562435/3438335
  • 知道为什么这可以在某些奥利奥设备上使用吗?我可以在某些 Oreo 设备上重现该问题,但不是全部 :) - 编辑:没关系,我找到了答案,测试实际上只在 26(8.0)上,而不是 27(8.1)或更多。嗬! ;)
【解决方案2】:

仅当您的应用程序面向 API 26(或更高版本)并且您使用 Firebase 11.8.0 并在装有 Android 8.0 的设备上启动它时,才会出现此错误。所以我决定只为这些版本修复它。解决方法: 您应该 override Application class 并覆盖它的 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"
        />

如果您按照说明进行操作,那么将由 Firebase SDK 呈现的 Android 8.0 上的所有通知都将显示为默认图标 @drawable/ic_firebase_notification

但我希望 Firebase 团队修复他们的有害检查并阅读how it's works

【讨论】:

【解决方案3】:

在 v12.0.0 中修复: https://firebase.google.com/support/release-notes/android#20180320

FIXED 修复了导致自定义通知图标出现问题的回归问题 在 Android 8.0 上被拒绝。

【讨论】:

    【解决方案4】:

    android studio 的版本是多少?具有新图标设计功能的 Android Studio 工作从 Android Studio 3.0 开始。如果您使用的是 android studio 3.0 或更高版本,请转到可绘制文件夹并调用上下文菜单以添加新的矢量或图像资源。查找 legacy 选项卡,它与早期版本的 android studio 具有相同的设置或功能。

    【讨论】:

    • 我有最新的安卓工作室,我使用了新的矢量资产功能。我通过将 Firebase 降级到旧版本来修复它。
    • 您的回答没有解决问题。问题在于 Firebase Cloud Messenger,而不是 Android Studio。
    【解决方案5】:

    您的图标必须是透明背景的.png,从矢量图形编辑器(AI,Sketch)转换而来,或者更好的是,它应该是.svg 只需尝试使用http://romannurik.github.io/AndroidAssetStudio web-service 将您的.png 图标转换为可绘制资源。它必须有助于解决您的问题,否则,您必须重新绘制图标。

    【讨论】:

    • 您的回答没有解决问题。这里的问题是 FCM 在 Android 8.0 上没有使用指定的图标作为后台通知消息,只有这个版本。所有其他版本都正常工作。问题不在于图标本身,而在于其他地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 2011-12-20
    • 1970-01-01
    • 2018-07-11
    • 2018-05-30
    • 1970-01-01
    • 2012-08-03
    相关资源
    最近更新 更多