Android 5.0及以上版本Firebase通知图标不显示问题求助
这问题我之前帮不少开发者排查过,核心原因其实是Android 7.0(Nougat)及以上系统对通知图标的强制规范,结合FCM的处理逻辑导致的——KitKat因为没有这个规范限制,所以能正常显示应用图标。
为什么会显示圆形/方形占位?
从Android 7.0开始,系统要求所有通知图标必须是透明背景的单色(推荐白色)图标。如果你的图标不符合这个要求(比如带彩色背景、有复杂色彩),系统会自动把它替换成统一的圆形(Oreo+)或方形(Nougat)占位样式,不管你在Manifest里怎么配置默认图标。
具体解决步骤
第一步:替换符合规范的通知图标
别直接用应用的启动图标当通知图标!启动图标带背景、有复杂色彩,完全不符合7.0+的通知图标要求。你可以用Android Studio的Image Asset Studio生成标准通知图标:- 右键项目里的
res目录 →New→Image Asset - 选择
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

