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
相关产品推荐
相关产品推荐

