Android Firebase推送通知setSmallIcon/setLargeIcon失效求助
问题排查与解决方案
我来帮你梳理下这个问题——能收到Firebase通知但图标不显示、没法展开,大概率是代码逻辑和系统规范的问题,咱们一步步来解决:
首先,最核心的bug:你没发送通知!
看你的showNotification方法,最后只调用了build()生成Notification对象,但完全没通过NotificationManager把通知发出去!这就是通知没法正常展开的关键原因,连通知都没触发显示,更别说图标了。
修复通知发送逻辑
修改你的方法,补充渠道创建(Android 8.0+必须)和通知发送的代码:
fun showNotification(title: String, body: String) { // 1. 为Android 8.0+创建通知渠道(必填) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel( "MyNotifications", "常规通知", NotificationManager.IMPORTANCE_DEFAULT ).apply { description = "接收Firebase推送的通知渠道" } val notificationManager = getSystemService(NotificationManager::class.java) notificationManager.createNotificationChannel(channel) } // 2. 加载大图标 val largeIcon = BitmapFactory.decodeResource(resources, R.drawable.iphn) // 3. 构建并发送通知 val notificationBuilder = NotificationCompat.Builder(this, "MyNotifications") .setLargeIcon(largeIcon) .setSmallIcon(R.drawable.ic_notif) .setContentTitle(title) .setContentText(body) .setStyle(NotificationCompat.BigPictureStyle() .bigPicture(largeIcon) .bigLargeIcon(null)) .setAutoCancel(true) // 点击后自动消失 .setPriority(NotificationCompat.PRIORITY_DEFAULT) // 触发通知显示 val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.notify(System.currentTimeMillis().toInt(), notificationBuilder.build()) }
然后解决矢量图标不显示的问题
Android对通知小图标有严格要求,矢量图标(VectorDrawable)在这里容易踩坑:
- 版本兼容:API 21(Android 5.0)以下的系统不支持矢量图标作为通知小图标,如果你要兼容旧版本,建议用Android Studio的Vector Asset工具把
ic_notif导出为png格式,放到对应分辨率的drawable文件夹里。 - 图标规范:通知小图标必须是透明背景+单色前景,系统会根据状态栏主题自动调整颜色,如果你的矢量图带了复杂颜色,会被系统过滤成白色/黑色,看起来就像没显示一样。
- 资源检查:确认
ic_notif确实在res/drawable文件夹里,名字没写错(比如大小写、拼写错误)。
最后验证BigPictureStyle的展开
BigPictureStyle的大图需要下拉通知或者点击后才会展开显示,你可以:
- 确保通知优先级设置正确(比如
PRIORITY_DEFAULT或更高),低优先级通知可能被系统折叠。 - 用原生Android模拟器测试,排除某些定制ROM对通知样式的修改。
额外提醒
如果你是通过Firebase Console发送的通知,注意:
- 如果发送的是通知消息(带
notification字段),只有当APP在前台时才会触发onMessageReceived;后台时系统会直接显示默认通知,不会走你的自定义逻辑。 - 想要完全控制通知样式,建议发送数据消息(只带
data字段),这样无论APP前后台都会触发onMessageReceived,让你自定义所有内容。
内容的提问来源于stack exchange,提问作者Sagar Balyan
相关产品推荐
相关产品推荐

