Android 推送通知:通知中不显示图标,而是显示白色方块
Android Push Notifications: Icon not displaying in notification, white square shown instead
我的应用程序生成了一个通知,但我为该通知设置的图标没有显示。相反,我得到一个白色方块。
我尝试调整图标的 png 大小(尺寸 720x720、66x66、44x44、22x22)。奇怪的是,当使用较小的尺寸时,白色方块会更小。
我用谷歌搜索了这个问题,以及生成通知的正确方法,从我读过的内容来看,我的代码应该是正确的。可悲的是,事情并非如此。
我的 phone 是装有 Android 5.1.1 的 Nexus 5。这个问题也出现在模拟器上,三星 Galaxy s4 Android 5.0.1 和摩托罗拉 Moto G Android 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 Lollipop,“通知图标必须全白”。
If we solve the white icon problem by setting target SDK to 20, our app
will not target Android Lollipop, which means that we cannot use
Lollipop-specific features.
针对目标 Sdk 21 的解决方案
如果要支持Lollipop Material 图标,则为Lollipop 及以上版本制作透明图标。请参考以下内容:
https://design.google.com/icons/
请查看 http://developer.android.com/design/style/iconography.html,我们会看到白色样式是通知在 Android Lollipop 中的显示方式。
在 Lollipop 中,Google 还建议我们使用一种会显示在白色通知图标后面的颜色。参考link:https://developer.android.com/about/versions/android-5.0-changes.html
任何我们想添加颜色的地方
https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#setColor(int)
低于和高于 Lollipop OS 版本的 Notification Builder 的实现将是:
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);
}
注意:setColor 仅在 Lollipop 中可用,并且只影响图标的背景。
彻底解决你的问题!!
我真的建议关注 Google's Design Guidelines:
上面写着 “通知图标必须完全是白色的。”
如果您想提供棒棒糖支持通知图标,请制作两种类型的通知图标:
- 普通通知图标:适用于以下棒棒糖版本。
- 透明背景的通知图标:适用于棒棒糖及以上版本。
现在根据 OS 版本在 运行 时为通知生成器设置适当的图标:
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);
}
我们可以这样做:
创建通知生成器的新对象并使用通知生成器对象调用 setSmallIcon()
,如下面的代码所示。
创建一个方法,我们将在其中检查我们正在安装我们的应用程序的 OS 版本。如果它低于 Lolipop,即 API 21,那么它将采用带有背景颜色的普通应用程序图标,否则它将采用没有任何背景的透明应用程序图标。因此使用 os 版本 >= 21 的设备将使用 Notification builder class 的方法 setColor()
设置图标的背景颜色。
示例代码:
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;
对于>=23的SDK,请添加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();
通知是灰度,如下所述。他们不是 black-and-white,不管其他人写了什么。您可能见过具有多种阴影的图标,例如网络强度条。
在 API 21 (Lollipop 5.0) 之前,彩色图标可以使用。您可以强制您的应用程序以 API 20 为目标,但这会限制您的应用程序可用的功能,因此不推荐这样做。您可以测试 运行 API 级别并适当地设置彩色图标或灰度图标,但这可能不值得。在大多数情况下,最好使用灰度图标。
图像有四个通道,RGBA(红/绿/蓝/alpha)。对于通知图标,Android 忽略 R、G 和 B 通道。唯一重要的通道是 Alpha,也称为不透明度。使用可让您控制绘图颜色的 Alpha 值的编辑器设计您的图标。
Alpha 值如何生成灰度图像:
- Alpha = 0(透明)— 这些像素是透明的,显示背景色。
- Alpha = 255(不透明)- 这些像素是白色的。
- Alpha = 1 ... 254 — 这些像素正是您所期望的,提供透明和白色之间的阴影。
换成 setColor
:
致电NotificationCompat.Builder.setColor(int argb)
。来自 Notification.color
的文档:
Accent color (an ARGB integer like the constants in Color) to be applied by the standard Style templates when presenting this notification. The current template design constructs a colorful header image by overlaying the icon image (stenciled in white) atop a field of this color. Alpha components are ignored.
我对 setColor 的测试显示 Alpha 组件未被忽略。较高的 Alpha 值将像素变为白色。较低的 Alpha 值会将通知区域中的像素变为背景颜色(在我的设备上为黑色),或变为 pull-down 通知中的指定颜色。
解决此问题的要求:
图像格式:32 位 PNG(带 alpha)
图像应该是透明的
透明颜色索引:白色 (FFFFFF)
来源:http://gr1350.blogspot.com/2017/01/problem-with-setsmallicon.html
终于找到了这个问题的解决方案。
仅当应用根本不存在时才会出现此问题运行。 (既不在后台也不在前台)。当 应用程序在前台或后台运行时,通知图标会正确显示。(不是白色方块)
所以我们要设置的是后端API通知图标的配置和前端相同。
在前端,我们使用了 React Native,对于推送通知,我们使用了 react-native-fcm npm package.
FCM.on("notification", notif => {
FCM.presentLocalNotification({
body: notif.fcm.body,
title: notif.fcm.title,
big_text: notif.fcm.body,
priority: "high",
large_icon: "notification_icon", // notification icon
icon: "notification_icon",
show_in_foreground: true,
color: '#8bc34b',
vibrate: 300,
lights: true,
status: notif.status
});
});
我们使用 fcm-push npm package 使用 Node.js 作为推送通知的后端,并设置有效负载结构如下。
{
to: '/topics/user', // required
data: {
id:212,
message: 'test message',
title: 'test title'
},
notification: {
title: 'test title',
body: 'test message',
icon : 'notification_icon', // same name as mentioned in the front end
color : '#8bc34b',
click_action : "BROADCAST"
}
}
它基本上搜索存储在我们 Android 系统本地的 notification_icon 图像。
在 Android 清单中声明此代码:
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_stat_name" />
希望对你有用。
试试这个
我遇到了同样的问题,我尝试了很多答案,但没有得到任何解决方案,最后我找到了解决问题的方法。
- 制作带有透明背景的通知图标。应用程序的宽度和高度必须像下面的尺寸一样,并将所有这些粘贴到您的项目中->app->src->main->res
MDPI 24*24
HDPI 36*36
XHDPI 48*48
XXHDPI 72*72
在上面的内容之后,将下面这行粘贴到您的 onMessageReceived 方法中
Intent intent = new Intent(this, News.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
notificationBuilder.setSmallIcon(R.drawable.notify)
// .setContentTitle(title)
// .setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
} else
{
notificationBuilder.setSmallIcon(R.drawable.notify)
// .setContentTitle(title)
// .setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
}
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
不要忘记在清单文件中添加此代码
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/app_icon" />
当您想要保留彩色图标时 - 解决方法
将颜色略有不同的像素添加到图标中。
在我的例子中,有一个带有阴影和光的黑色图标。当添加深蓝色像素时,它会起作用。
如果您使用的是Google云消息,那么这个问题将无法通过简单地更改您的图标来解决。例如,这将不起作用:
Notification notification = new Notification.Builder(this)
.setContentTitle(title)
.setContentText(text)
.setSmallIcon(R.drawable.ic_notification)
.setContentIntent(pIntent)
.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_LIGHTS|Notification.DEFAULT_VIBRATE)
.setAutoCancel(true)
.build();
就算ic_notification也是透明白的。它也必须在 Manifest 元数据中定义,如下所示:
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_notification" />
元数据位于 application
标签下,供参考。
我在 android 8.0 上遇到了类似的问题。尝试使用白色图标资源。当我尝试使用彩色图像作为图标时出现白色方块,当我将其替换为白色图标时,它开始工作了。
我找到了一个link我们可以生成我们自己的白色图标,
try this link to generate white icon of your launcher icon.
打开此 Link 并上传您的 ic_launcher 或通知图标
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_notification" />
在应用程序块的 manifest.xml 文件中添加此行。
我已通过添加以下代码来解决问题,
<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" />
其中 ic_stat_name
创建于 Android Studio 右键单击资源 >> 新建 >>图像资源 >> IconType(通知)
还有一个步骤我必须在服务器 php 端用通知负载
$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"
]
]
其中图标名称 "icon" => "ic_stat_name"
应该与清单上的图标集相同。
(Android Studio 3.5) 如果您使用的是最新版本的 Android Studio,您可以生成通知图像。 右键单击您的 res 文件夹 > 新建 > 图像资源。然后,您将看到 配置图像资产,如下图所示。将图标类型更改为通知图标。您的图像必须是白色和透明的。此 配置图像资产 将强制执行该规则。
重要提示:如果您希望图标用于 cloud/push 通知,您必须在您的应用程序标签下添加元数据以使用新创建的通知图标。
<application>
...
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_notification" />
要减少特定于 SDK 的版本,您可以简单地执行以下操作:(将“#”替换为“0x”)
Notification notification = new NotificationCompat.Builder(this);
notification.setSmallIcon(R.drawable.icon_transperent);
notification.setColor(0x169AB9); //for color: #169AB9
我刚把我的png转成透明png,然后图标和图片形状一样,但颜色不一样
对于自定义本地通知,在AndroidManifest.xml中添加以下元数据即可。
<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" />
......
我的应用程序生成了一个通知,但我为该通知设置的图标没有显示。相反,我得到一个白色方块。
我尝试调整图标的 png 大小(尺寸 720x720、66x66、44x44、22x22)。奇怪的是,当使用较小的尺寸时,白色方块会更小。
我用谷歌搜索了这个问题,以及生成通知的正确方法,从我读过的内容来看,我的代码应该是正确的。可悲的是,事情并非如此。
我的 phone 是装有 Android 5.1.1 的 Nexus 5。这个问题也出现在模拟器上,三星 Galaxy s4 Android 5.0.1 和摩托罗拉 Moto G Android 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 Lollipop,“通知图标必须全白”。
If we solve the white icon problem by setting target SDK to 20, our app will not target Android Lollipop, which means that we cannot use Lollipop-specific features.
针对目标 Sdk 21 的解决方案
如果要支持Lollipop Material 图标,则为Lollipop 及以上版本制作透明图标。请参考以下内容: https://design.google.com/icons/
请查看 http://developer.android.com/design/style/iconography.html,我们会看到白色样式是通知在 Android Lollipop 中的显示方式。
在 Lollipop 中,Google 还建议我们使用一种会显示在白色通知图标后面的颜色。参考link:https://developer.android.com/about/versions/android-5.0-changes.html
任何我们想添加颜色的地方 https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#setColor(int)
低于和高于 Lollipop OS 版本的 Notification Builder 的实现将是:
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);
}
注意:setColor 仅在 Lollipop 中可用,并且只影响图标的背景。
彻底解决你的问题!!
我真的建议关注 Google's Design Guidelines:
上面写着 “通知图标必须完全是白色的。”
如果您想提供棒棒糖支持通知图标,请制作两种类型的通知图标:
- 普通通知图标:适用于以下棒棒糖版本。
- 透明背景的通知图标:适用于棒棒糖及以上版本。
现在根据 OS 版本在 运行 时为通知生成器设置适当的图标:
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);
}
我们可以这样做:
创建通知生成器的新对象并使用通知生成器对象调用 setSmallIcon()
,如下面的代码所示。
创建一个方法,我们将在其中检查我们正在安装我们的应用程序的 OS 版本。如果它低于 Lolipop,即 API 21,那么它将采用带有背景颜色的普通应用程序图标,否则它将采用没有任何背景的透明应用程序图标。因此使用 os 版本 >= 21 的设备将使用 Notification builder class 的方法 setColor()
设置图标的背景颜色。
示例代码:
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;
对于>=23的SDK,请添加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();
通知是灰度,如下所述。他们不是 black-and-white,不管其他人写了什么。您可能见过具有多种阴影的图标,例如网络强度条。
在 API 21 (Lollipop 5.0) 之前,彩色图标可以使用。您可以强制您的应用程序以 API 20 为目标,但这会限制您的应用程序可用的功能,因此不推荐这样做。您可以测试 运行 API 级别并适当地设置彩色图标或灰度图标,但这可能不值得。在大多数情况下,最好使用灰度图标。
图像有四个通道,RGBA(红/绿/蓝/alpha)。对于通知图标,Android 忽略 R、G 和 B 通道。唯一重要的通道是 Alpha,也称为不透明度。使用可让您控制绘图颜色的 Alpha 值的编辑器设计您的图标。
Alpha 值如何生成灰度图像:
- Alpha = 0(透明)— 这些像素是透明的,显示背景色。
- Alpha = 255(不透明)- 这些像素是白色的。
- Alpha = 1 ... 254 — 这些像素正是您所期望的,提供透明和白色之间的阴影。
换成 setColor
:
致电
NotificationCompat.Builder.setColor(int argb)
。来自Notification.color
的文档:Accent color (an ARGB integer like the constants in Color) to be applied by the standard Style templates when presenting this notification. The current template design constructs a colorful header image by overlaying the icon image (stenciled in white) atop a field of this color. Alpha components are ignored.
我对 setColor 的测试显示 Alpha 组件未被忽略。较高的 Alpha 值将像素变为白色。较低的 Alpha 值会将通知区域中的像素变为背景颜色(在我的设备上为黑色),或变为 pull-down 通知中的指定颜色。
解决此问题的要求:
图像格式:32 位 PNG(带 alpha)
图像应该是透明的
透明颜色索引:白色 (FFFFFF)
来源:http://gr1350.blogspot.com/2017/01/problem-with-setsmallicon.html
终于找到了这个问题的解决方案。
仅当应用根本不存在时才会出现此问题运行。 (既不在后台也不在前台)。当 应用程序在前台或后台运行时,通知图标会正确显示。(不是白色方块)
所以我们要设置的是后端API通知图标的配置和前端相同。
在前端,我们使用了 React Native,对于推送通知,我们使用了 react-native-fcm npm package.
FCM.on("notification", notif => {
FCM.presentLocalNotification({
body: notif.fcm.body,
title: notif.fcm.title,
big_text: notif.fcm.body,
priority: "high",
large_icon: "notification_icon", // notification icon
icon: "notification_icon",
show_in_foreground: true,
color: '#8bc34b',
vibrate: 300,
lights: true,
status: notif.status
});
});
我们使用 fcm-push npm package 使用 Node.js 作为推送通知的后端,并设置有效负载结构如下。
{
to: '/topics/user', // required
data: {
id:212,
message: 'test message',
title: 'test title'
},
notification: {
title: 'test title',
body: 'test message',
icon : 'notification_icon', // same name as mentioned in the front end
color : '#8bc34b',
click_action : "BROADCAST"
}
}
它基本上搜索存储在我们 Android 系统本地的 notification_icon 图像。
在 Android 清单中声明此代码:
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_stat_name" />
希望对你有用。
试试这个
我遇到了同样的问题,我尝试了很多答案,但没有得到任何解决方案,最后我找到了解决问题的方法。
- 制作带有透明背景的通知图标。应用程序的宽度和高度必须像下面的尺寸一样,并将所有这些粘贴到您的项目中->app->src->main->res
MDPI 24*24
HDPI 36*36
XHDPI 48*48
XXHDPI 72*72
在上面的内容之后,将下面这行粘贴到您的 onMessageReceived 方法中
Intent intent = new Intent(this, News.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
notificationBuilder.setSmallIcon(R.drawable.notify)
// .setContentTitle(title)
// .setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
} else
{
notificationBuilder.setSmallIcon(R.drawable.notify)
// .setContentTitle(title)
// .setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
}
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
不要忘记在清单文件中添加此代码
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/app_icon" />
当您想要保留彩色图标时 - 解决方法
将颜色略有不同的像素添加到图标中。
在我的例子中,有一个带有阴影和光的黑色图标。当添加深蓝色像素时,它会起作用。
如果您使用的是Google云消息,那么这个问题将无法通过简单地更改您的图标来解决。例如,这将不起作用:
Notification notification = new Notification.Builder(this)
.setContentTitle(title)
.setContentText(text)
.setSmallIcon(R.drawable.ic_notification)
.setContentIntent(pIntent)
.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_LIGHTS|Notification.DEFAULT_VIBRATE)
.setAutoCancel(true)
.build();
就算ic_notification也是透明白的。它也必须在 Manifest 元数据中定义,如下所示:
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_notification" />
元数据位于 application
标签下,供参考。
我在 android 8.0 上遇到了类似的问题。尝试使用白色图标资源。当我尝试使用彩色图像作为图标时出现白色方块,当我将其替换为白色图标时,它开始工作了。
我找到了一个link我们可以生成我们自己的白色图标,
try this link to generate white icon of your launcher icon.
打开此 Link 并上传您的 ic_launcher 或通知图标
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_notification" />
在应用程序块的 manifest.xml 文件中添加此行。
我已通过添加以下代码来解决问题,
<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" />
其中 ic_stat_name
创建于 Android Studio 右键单击资源 >> 新建 >>图像资源 >> IconType(通知)
还有一个步骤我必须在服务器 php 端用通知负载
$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"
]
]
其中图标名称 "icon" => "ic_stat_name"
应该与清单上的图标集相同。
(Android Studio 3.5) 如果您使用的是最新版本的 Android Studio,您可以生成通知图像。 右键单击您的 res 文件夹 > 新建 > 图像资源。然后,您将看到 配置图像资产,如下图所示。将图标类型更改为通知图标。您的图像必须是白色和透明的。此 配置图像资产 将强制执行该规则。
<application>
...
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_notification" />
要减少特定于 SDK 的版本,您可以简单地执行以下操作:(将“#”替换为“0x”)
Notification notification = new NotificationCompat.Builder(this);
notification.setSmallIcon(R.drawable.icon_transperent);
notification.setColor(0x169AB9); //for color: #169AB9
我刚把我的png转成透明png,然后图标和图片形状一样,但颜色不一样
对于自定义本地通知,在AndroidManifest.xml中添加以下元数据即可。
<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" />
......