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

Firebase Cloud Messaging:Android Oreo通知图标异常问题

解决Android Oreo上Firebase Messaging通知图标异常问题

嘿,这个问题我太熟了!Android Oreo(8.0)的通知机制改了不少,尤其是图标这块踩过的坑能列一长串,咱们一步步来解决:

1. 先搞定Oreo必须的通知渠道

Oreo及以上版本强制要求通知关联通知渠道,如果没创建渠道,系统会自动用默认渠道,大概率会导致图标显示异常。所以第一步先确保你的App里创建了通知渠道:

创建通知渠道的代码示例(Kotlin)

override fun onCreate() {
    super.onCreate()
    // 仅在Oreo及以上版本创建渠道
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val channelId = "your_custom_channel_id" // 自定义渠道ID,要和payload里的一致
        val channelName = "App通知" // 渠道名称,用户在系统设置里能看到
        val importance = NotificationManager.IMPORTANCE_DEFAULT
        val channel = NotificationChannel(channelId, channelName, importance).apply {
            // 可选:设置渠道的声音、震动等属性
            setShowBadge(true)
        }
        // 注册渠道
        val notificationManager = getSystemService(NotificationManager::class.java)
        notificationManager.createNotificationChannel(channel)
    }
}

Java版本

@Override
public void onCreate() {
    super.onCreate();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        String channelId = "your_custom_channel_id";
        String channelName = "App通知";
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
        channel.setShowBadge(true);
        NotificationManager notificationManager = getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
    }
}

2. 检查通知图标是否符合Oreo要求

这是最容易踩坑的点!Oreo对通知图标有严格要求:

  • 必须是透明背景的白色单色PNG(不能有其他颜色,否则系统会把非白色部分改成透明,然后套上默认的绿色背景机器人图标)
  • 图标要放在对应的drawable-xxxhdpi、drawable-xxhdpi等分辨率目录(不要只放一个目录,要适配不同设备),别放在mipmap目录里
  • 图标命名用小写字母+下划线,比如ic_notification,避免特殊字符或大写

3. 修正Firebase Messaging的Payload配置

如果是后台发送的推送,除了icon字段,必须加上channel_id字段(和你代码里创建的渠道ID一致),否则推送会走系统默认渠道,图标大概率异常。示例Payload:

{
  "notification": {
    "title": "新消息",
    "body": "快来看看",
    "icon": "ic_notification", // 你的图标文件名(不带后缀)
    "channel_id": "your_custom_channel_id" // 必须和代码里的渠道ID一致
  },
  "to": "用户的FCM token"
}

如果是App本地触发的通知,一定要在NotificationCompat.Builder里指定setSmallIcon()和setChannelId():

val notification = NotificationCompat.Builder(this, "your_custom_channel_id")
    .setSmallIcon(R.drawable.ic_notification) // 这里指定你的图标
    .setContentTitle("测试通知")
    .setContentText("看看图标正常不")
    .build()

NotificationManagerCompat.from(this).notify(1, notification)

4. 排查系统误判“自适应图标”的问题

有时候即使你没使用自适应图标(即没有ic_notification.xml这类自适应图标文件),系统也可能误判:

  • 检查drawable目录下有没有和图标同名的xml文件(比如ic_notification.xml),有的话删掉,只保留PNG图标
  • 确保图标文件名没有和系统默认自适应图标重名(比如别叫ic_launcher,这是应用图标的默认名)

5. 先做本地测试排除问题

建议先写个本地通知测试(不用Firebase),如果本地通知图标正常,那问题肯定出在Firebase的Payload配置;如果本地也不正常,那就是图标或者渠道的问题,针对性排查就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:31:03