FCM默认图标使用无效渐变

时间:2018-01-07 13:50:33

标签: android firebase firebase-cloud-messaging

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

  

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

默认图标仅包含一种颜色。我用多个不同的图标测试了它,但总是使用Android标准图标。

5 个答案:

答案 0 :(得分:13)

更新:由版本12.0.0中的firebase修复

下面的错误代码已经使用此更新,它在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)。这种检查的原因是因为自适应图标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中注意到,我的应用程序每次通知都会点击此代码两次,它会尝试我的通知drawable,我根据Firebase的说明在清单中设置,然后再次点击它尝试为启动器图标执行此操作。两者都失败了,即使我把它们制作成纯色的抽屉。

根据来自southrop的另一条评论,firebase团队已经意识到了这个问题并正在努力解决问题,但没有给出时间表。

此代码不在11.6.0及更低版本中,因此如果你真的需要暂时工作,请降级你的firebase。

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

答案 1 :(得分:10)

只有当您的应用程序定位到API 26(或更高版本)且您使用Firebase 11.8.0并在装有Android 8.0的设备上启动时,才会出现此错误。所以我决定只为这些版本修复它。解决方法: 您应该override Application class并覆盖它的getResources()以返回修补的Resources类:

@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"
        />

如果您按照说明操作,将在FirePro SDK上呈现的Android 8.0上的所有通知都会显示为默认图标@ drawable / ic_firebase_notification

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

答案 2 :(得分:1)

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

  

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

答案 3 :(得分:-1)

Android工作室的版本是什么? Android Studio使用新的图标设计功能从Android Studio 3.0开始。如果您使用的是android studio 3.0或更高版本,请转到drawable文件夹并调用上下文菜单添加新的矢量或图像资源。查找旧版标签,这与早期版本的android studio的设置或功能相同。

答案 4 :(得分:-2)

你的图标必须是带透明背景的.png,从矢量图形编辑器(AI,Sketch)转换,或者更好的是它应该是.svg 只需尝试使用http://romannurik.github.io/AndroidAssetStudio网络服务转换可绘制资源中的.png图标。它必须有助于解决您的问题,如果没有,您必须重绘您的图标。