FCM接收器构建通知时图标显示为白色方块的问题求助
解决FCM通知图标显示白色方块的问题
Hey,我来帮你搞定这个问题!你遇到的白色方块其实是Android系统的规范限制导致的,具体原因和解决方案如下:
问题根源
从Android 5.0(API Level 21)开始,系统对通知的smallIcon有硬性要求:必须是白色图形、透明背景的单色调图标。如果你的PNG应用图标是彩色或者带不透明背景的,系统会自动将它处理成白色方块,这就是你看到的情况。
具体修复步骤
1. 准备符合规范的通知图标
- 制作一个仅包含白色图形、背景完全透明的PNG图标(推荐用VectorDrawable矢量图,适配各种屏幕分辨率更省心)
- 将图标放入项目的
res/drawable-*dpi对应分辨率目录,命名比如ic_notification.png - 划重点:别直接拿带颜色的应用图标当通知小图标用!
2. 修改代码适配系统版本
如果想兼顾低版本系统(Android 5.0以下)的彩色图标显示,同时满足高版本规范,可以这样修改代码:
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context); // 针对不同系统版本设置图标 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // Android 5.0+ 使用合规的单色调通知图标 mBuilder.setSmallIcon(R.drawable.ic_notification); // 可选:给图标设置背景色(如果需要让图标区域有底色) mBuilder.setColor(ContextCompat.getColor(context, R.color.your_notification_color)); } else { // 低版本系统可以继续用原应用图标 mBuilder.setSmallIcon(R.drawable.icon); } mBuilder.setContentTitle("Your chat is going to expire tomorrow!"); // 以下原有代码保持不变 Intent resultIntent = new Intent(this, main_activity.class); resultIntent.putExtra("launchedFromNotification", true); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(main_activity.class); stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent( 0, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(resultPendingIntent); NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(MESSAGE_NOTIFICATION_ID, mBuilder.build());
额外小贴士
- 如果你是通过Firebase控制台发送通知,别忘了控制台里设置的通知图标也得符合规范,否则FCM推送时会覆盖你代码里设置的图标
- 用Android Studio自带的Image Asset Studio生成标准通知图标超方便:右键项目里的
res目录 → New → Image Asset → 选择Notification Icon类型,跟着向导一步步生成就行
内容的提问来源于stack exchange,提问作者Ahmed Khairy
相关产品推荐
相关产品推荐

