Android推送通知:通知中未显示图标,而是显示白色方框
我的应用程序生成通知,但未显示我为该通知设置的图标。相反,我得到了一个白色的正方形 我尝试过调整图标的png大小(尺寸为720x720、66x66、44x44、22x22)。奇怪的是,当使用更小的尺寸时,白色正方形更小 我已经用谷歌搜索了这个问题,以及生成通知的正确方法,从我阅读的代码来看,应该是正确的。可悲的是,事情并不像他们应该的那样 我的手机是带有安卓5.1.1的Nexus5。这个问题也出现在模拟器上,三星Galaxy s4搭载安卓5.0.1,摩托罗拉Moto G搭载安卓5.0.1(两者都是我借来的,现在还没有) 下面是通知代码和两个屏幕截图。如果您需要更多信息,请随时索取 谢谢大家Android推送通知:通知中未显示图标,而是显示白色方框,android,push-notification,notifications,firebase-cloud-messaging,icons,Android,Push Notification,Notifications,Firebase Cloud Messaging,Icons,我的应用程序生成通知,但未显示我为该通知设置的图标。相反,我得到了一个白色的正方形 我尝试过调整图标的png大小(尺寸为720x720、66x66、44x44、22x22)。奇怪的是,当使用更小的尺寸时,白色正方形更小 我已经用谷歌搜索了这个问题,以及生成通知的正确方法,从我阅读的代码来看,应该是正确的。可悲的是,事情并不像他们应该的那样 我的手机是带有安卓5.1.1的Nexus5。这个问题也出现在模拟器上,三星Galaxy s4搭载安卓5.0.1,摩托罗拉Moto G搭载安卓5.0.1(两者都
@SuppressLint("NewApi") private void sendNotification(String msg, String title, String link, Bundle bundle) {
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class);
resultIntent.putExtras(bundle);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
resultIntent, Intent.FLAG_ACTIVITY_NEW_TASK);
Notification notification;
Uri sound = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.notificationsound);
notification = new Notification.Builder(this)
.setSmallIcon(R.drawable.lg_logo)
.setContentTitle(title)
.setStyle(new Notification.BigTextStyle().bigText(msg))
.setAutoCancel(true)
.setContentText(msg)
.setContentIntent(contentIntent)
.setSound(sound)
.build();
notificationManager.notify(0, notification);
}
原因:对于5.0棒棒糖,通知图标必须完全为白色。 如果我们通过将目标SDK设置为20来解决白色图标问题,我们的应用程序 不会针对Android棒棒糖,这意味着我们不能使用 棒棒糖特有的功能 目标Sdk 21的解决方案 如果你想支持棒棒糖材质图标,那么为棒棒糖和以上版本制作透明图标。请参阅以下资料: 请看,我们将看到白色样式是如何在Android棒棒糖中显示通知的 在棒棒糖中,谷歌还建议我们使用白色通知图标后面显示的颜色。参考链接: 无论我们想在哪里添加颜色 下面和上面的棒棒糖操作系统版本的通知生成器的实现是:
Notification notification = new NotificationCompat.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
notification.setSmallIcon(R.drawable.icon_transperent);
notification.setColor(getResources().getColor(R.color.notification_color));
} else {
notification.setSmallIcon(R.drawable.icon);
}
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
notificationBuilder.setSmallIcon(getNotificationIcon(notificationBuilder));
private int getNotificationIcon(NotificationCompat.Builder notificationBuilder) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int color = 0x008000;
notificationBuilder.setColor(color);
return R.drawable.app_icon_lolipop_above;
}
return R.drawable.app_icon_lolipop_below;
}
注意:setColor仅在棒棒糖中可用,它只影响图标的背景。
它将彻底解决您的问题我真的建议如下:
上面写着“通知图标必须完全是白色的。”如果您想提供棒棒糖支持通知图标,请制作两种类型的通知图标:
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mBuilder.setSmallIcon(R.drawable.ic_push_notification_transperent);
} else {
mBuilder.setSmallIcon(R.drawable.ic_push_notification);
}
我们可以这样做:
创建notification builder的新对象,并使用下面代码中的notification builder对象调用setSmallIcon()
创建一个方法,在该方法中,我们将检查安装应用程序的操作系统版本。如果它低于Lolipop,即API 21,则它将采用带背景色的普通应用程序图标,否则它将采用无任何背景的透明应用程序图标。因此,使用os版本>=21的设备将使用Notification builder类的方法setColor()
设置图标的背景色
示例代码:
Notification notification = new NotificationCompat.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
notification.setSmallIcon(R.drawable.icon_transperent);
notification.setColor(getResources().getColor(R.color.notification_color));
} else {
notification.setSmallIcon(R.drawable.icon);
}
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
notificationBuilder.setSmallIcon(getNotificationIcon(notificationBuilder));
private int getNotificationIcon(NotificationCompat.Builder notificationBuilder) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int color = 0x008000;
notificationBuilder.setColor(color);
return R.drawable.app_icon_lolipop_above;
}
return R.drawable.app_icon_lolipop_below;
}
您可以为不同的版本使用不同的图标。只需在图标上设置如下逻辑:
int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.colored_: R.drawable.white_tint_icon_for_lolipop_or_upper;
对于SDK>=23,请添加setLargeIcon
notification = new Notification.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setLargeIcon(context.getResources(), R.drawable.lg_logo))
.setContentTitle(title)
.setStyle(new Notification.BigTextStyle().bigText(msg))
.setAutoCancel(true)
.setContentText(msg)
.setContentIntent(contentIntent)
.setSound(sound)
.build();
通知是灰标的,如下所述。他们不是黑白的,不管别人写了什么。您可能已经看到了具有多种阴影的图标,如网络强度条 在API 21(棒棒糖5.0)之前,彩色图标可以工作。您可以强制应用程序以API 20为目标,但这限制了应用程序可用的功能,因此不建议这样做。您可以测试正在运行的API级别,并适当地设置颜色图标或灰度图标,但这可能不值得。在大多数情况下,最好使用灰度图标 图像有四个通道,RGBA(红色/绿色/蓝色/阿尔法)。对于通知图标,Android会忽略R、G和B通道。唯一计数的通道是Alpha,也称为不透明度。使用编辑器设计图标,使您可以控制绘图颜色的Alpha值 Alpha值如何生成灰度图像:
Notification notification = new NotificationCompat.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
notification.setSmallIcon(R.drawable.icon_transperent);
notification.setColor(getResources().getColor(R.color.notification_color));
} else {
notification.setSmallIcon(R.drawable.icon);
}
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
notificationBuilder.setSmallIcon(getNotificationIcon(notificationBuilder));
private int getNotificationIcon(NotificationCompat.Builder notificationBuilder) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int color = 0x008000;
notificationBuilder.setColor(color);
return R.drawable.app_icon_lolipop_above;
}
return R.drawable.app_icon_lolipop_below;
}
- Alpha=0(透明)-这些像素是透明的,显示背景色
- Alpha=255(不透明)-这些像素为白色
- α=1。。。254-这些像素正是您所期望的,提供透明和白色之间的阴影
setColor对其进行更改:
Notification notification = new NotificationCompat.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
notification.setSmallIcon(R.drawable.icon_transperent);
notification.setColor(getResources().getColor(R.color.notification_color));
} else {
notification.setSmallIcon(R.drawable.icon);
}
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
notificationBuilder.setSmallIcon(getNotificationIcon(notificationBuilder));
private int getNotificationIcon(NotificationCompat.Builder notificationBuilder) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int color = 0x008000;
notificationBuilder.setColor(color);
return R.drawable.app_icon_lolipop_above;
}
return R.drawable.app_icon_lolipop_below;
}
- 调用
。从NotificationCompat.Builder.setColor(int argb)
的文档中: 显示此通知时由标准样式模板应用的强调色(类似于颜色中的常量的ARGB整数)。当前模板设计通过将图标图像(用白色模版打印)覆盖在该颜色字段的顶部来构造彩色标题图像。忽略Alpha组件 我使用setColor进行的测试表明,Alpha组件未被忽略。较高的Alpha值会使像素变白。较低的Alpha值会将像素变为通知区域中的背景色(我的设备上为黑色),或变为下拉通知中的指定颜色Notification.color
- 图像格式:32位PNG(带alpha)
- 图像应该是透明的
- 透明度颜色索引:白色(FFFF)
解决此问题的要求:
来源:我终于找到了这个问题的解决方案 只有当应用程序根本没有运行时,才会出现此问题。(不在背景中也不在前景中)。当应用程序在前台或后台运行时,通知图标将正确显示(而不是白色方块) 所以我们要设置的是后端API中通知图标的配置与前端相同。 从正面看
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_notification" />
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_notification" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_stat_name" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/black" />
$message = [
"message" => [
"notification" => [
"body" => $title ,
"title" => $message
],
"token" => $token,
"android" => [
"notification" => [
"sound" => "default",
"icon" => "ic_stat_name"
]
],
"data" => [
"title" => $title,
"message" => $message
]
]
];
"android" => [
"notification" => [
"sound" => "default",
"icon" => "ic_stat_name"
]
]
<application>
...
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_notification" />
Notification notification = new NotificationCompat.Builder(this);
notification.setSmallIcon(R.drawable.icon_transperent);
notification.setColor(0x169AB9); //for color: #169AB9
<application
android:name="xxxxxx"
android:label="xxxxxx"
android:icon="@mipmap/ic_launcher"
>
<meta-data
android:name="your_apps_bundle_id.default_notification_icon"
android:resource="@drawable/ic_notif" />
......