Android 13及以上推送通知自定义图标显示白圈问题修复咨询
Android 13+ 通知自定义图标显示为白圈的问题排查与修复
问题成因
Android 13(API 33)及以上版本对通知图标的规范做了更严格的限制,核心原因包括:
- 图标不符合单色透明规范:系统要求通知图标只能是带alpha通道的单色图形(无彩色填充),彩色图标会被自动替换为默认白圈
- 图标资源位置或尺寸不达标:mipmap目录主要用于应用启动图标,通知图标放在这里可能无法被Android 13+的通知系统正确识别;同时图标尺寸不足、边缘留白不够也会触发系统替换
- 代码/第三方推送配置缺失:没有在通知构建时明确指定符合要求的图标,或第三方推送后台配置的图标不符合新版规范
修复方法
1. 重新制作符合规范的通知图标
- 图标必须是透明背景+单色形状(仅保留alpha通道信息,颜色会由系统根据主题自动调整),禁止使用彩色填充的图标
- 优先使用矢量图(命名如
ic_notification.xml),放在drawable目录,矢量图能适配所有分辨率,且更容易满足系统的透明度要求 - 图标尺寸参考官方规范:24dp×24dp(mdpi)、36dp×36dp(hdpi)、48dp×48dp(xhdpi)、72dp×72dp(xxhdpi)、96dp×96dp(xxxhdpi),边缘至少留2dp留白
2. 调整通知构建代码
在创建通知时,明确指定drawable目录下的单色图标,还可按需设置图标 tint 颜色适配系统主题:
// Kotlin 示例 val notificationBuilder = NotificationCompat.Builder(context, YOUR_CHANNEL_ID) .setSmallIcon(R.drawable.ic_notification) // 核心:指定符合规范的图标 .setColor(ContextCompat.getColor(context, R.color.your_notification_tint)) // 可选:设置图标 tint 色 .setContentTitle("通知标题") .setContentText("通知内容") .setPriority(NotificationCompat.PRIORITY_DEFAULT)
3. 检查第三方推送配置(如Firebase)
如果使用第三方推送服务,需确保:
- 后台推送 payload 中的
icon字段指定为你的自定义图标名称(不带扩展名,比如ic_notification) - 后台上传的通知图标符合Android 13+的单色透明规范
4. 同步更新通知渠道配置
Android 8.0+的通知渠道若设置了默认图标,会覆盖通知中的图标配置,需同步更新:
// Kotlin 示例 val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel(YOUR_CHANNEL_ID, "渠道名称", NotificationManager.IMPORTANCE_DEFAULT) channel.setIcon(R.drawable.ic_notification) // 渠道图标同步设置 notificationManager.createNotificationChannel(channel) }
内容的提问来源于stack exchange,提问作者SalmanNaghori
相关产品推荐
相关产品推荐

