You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 5.0及以上版本Firebase通知图标不显示问题求助

问题分析与解决思路

这问题我之前帮不少开发者排查过,核心原因其实是Android 7.0(Nougat)及以上系统对通知图标的强制规范,结合FCM的处理逻辑导致的——KitKat因为没有这个规范限制,所以能正常显示应用图标。

为什么会显示圆形/方形占位?

从Android 7.0开始,系统要求所有通知图标必须是透明背景的单色(推荐白色)图标。如果你的图标不符合这个要求(比如带彩色背景、有复杂色彩),系统会自动把它替换成统一的圆形(Oreo+)或方形(Nougat)占位样式,不管你在Manifest里怎么配置默认图标。

具体解决步骤

  • 第一步:替换符合规范的通知图标
    别直接用应用的启动图标当通知图标!启动图标带背景、有复杂色彩,完全不符合7.0+的通知图标要求。你可以用Android Studio的Image Asset Studio生成标准通知图标:

    1. 右键项目里的res目录 → New → Image Asset
    2. 选择Notification Icon类型,跟着向导生成,它会自动生成适配不同dpi的透明单色图标,尺寸分别是:
      • mdpi: 24x24
      • hdpi: 36x36
      • xhdpi: 48x48
      • xxhdpi: 72x72
      • xxxhdpi: 96x96
  • 第二步:确认Manifest配置的正确性
    确保你的<meta-data>标签放在<application>标签内部(不是某个<activity>里),并且引用的是刚生成的通知图标:

    <application ...>
      <!-- 其他配置 -->
      <meta-data
          android:name="com.google.firebase.messaging.default_notification_icon"
          android:resource="@drawable/ic_notification" /> <!-- 这里换成你生成的通知图标 -->
    </application>
    

    注意:尽量把通知图标放在drawable目录下,部分机型对mipmap目录的图标处理可能有差异。

  • 第三步:排查FCM payload的影响
    如果你是通过Firebase控制台或服务器API发送通知,要检查payload里有没有指定icon字段。如果指定了,这个字段会覆盖Manifest里的默认配置,如果该图标不符合规范,还是会被系统替换。建议暂时去掉payload里的icon参数,让FCM使用Manifest的默认配置。

  • 第四步:本地测试验证
    先抛开FCM,用Android原生的NotificationManager发送一个本地通知,手动设置你生成的通知图标:

    val notification = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_notification)
        .setContentTitle("测试通知")
        .setContentText("看看图标是否正常显示")
        .build()
    NotificationManagerCompat.from(this).notify(1, notification)
    

    如果本地通知图标显示正常,那问题就出在FCM的配置或payload上;如果本地也显示圆形/方形,那就是图标本身或Manifest配置的问题。

  • 第五步:定制ROM的特殊处理
    像小米、华为这类定制ROM,可能对通知图标有额外的处理逻辑。如果前面的步骤都做了还是有问题,可以尝试在FirebaseMessagingService的onMessageReceived方法里,手动构建通知并指定图标:

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_notification) // 手动指定符合规范的图标
            .setContentTitle(remoteMessage.notification?.title)
            .setContentText(remoteMessage.notification?.body)
        // 发送通知
        NotificationManagerCompat.from(this).notify(System.currentTimeMillis().toInt(), notificationBuilder.build())
    }
    

总结

本质问题就是Android 7.0+的通知图标强制规范,只要你换成符合要求的透明单色图标,再配合正确的配置,就能解决FCM通知显示圆形/方形占位的问题。

内容的提问来源于stack exchange,提问作者user1209216

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:02:43