Android推送通知:通知中不显示图标,而是显示白色方框

我的应用程序生成了一个通知,但我为该通知设置的图标不显示。相反,我得到了一个白色的正方形。

我已经尝试调整图标的png大小(尺寸720x720, 66x66, 44x44, 22x22)。奇怪的是,当使用更小的维度时,白色正方形也更小。

我已经谷歌了这个问题,以及生成通知的正确方式,从我所读到的我的代码应该是正确的。不幸的是,事情并不像他们应该的那样。

我的手机是装有安卓5.1.1系统的Nexus 5。这一问题也出现在模拟器上,比如安装Android 5.0.1的三星Galaxy s4和安装Android 5.0.1的摩托罗拉Moto G(这两款模拟器都是我借来的,现在没有)。

下面是通知代码和两个截图。如果你需要更多的信息,请尽管提出来。

谢谢大家。

@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);
}

without opening the notification notifications opened

291115 次浏览

原因:对于5.0版本的“棒棒糖”通知图标必须完全是白色的。

如果我们通过将目标SDK设置为20来解决白色图标问题,我们的应用程序 不会针对安卓棒棒糖,这意味着我们不能使用 Lollipop-specific特性。< / p >

目标Sdk 21的解决方案

如果你想支持棒棒糖材质图标,那么为棒棒糖和上面的版本制作透明图标。请参阅以下资料: https://design.google.com/icons/ < / p >

请查看http://developer.android.com/design/style/iconography.html,我们将看到白色风格是通知在Android棒棒糖中显示的方式。

在Lollipop中,谷歌还建议我们使用一种将显示在白色通知图标后面的颜色。参考链接:https://developer.android.com/about/versions/android-5.0-changes.html

无论我们想添加颜色 https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html改变颜色(int) < / p >

以下和以上棒棒糖操作系统版本的通知生成器的实现将:

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中可用,它只影响图标的背景。

它将彻底解决你的问题!!

根据谷歌的设计指南:

通知图标必须完全为白色。

如果你想提供棒棒糖支持的通知图标,那么做两种类型的通知图标:

  1. 普通通知图标:适用于棒棒糖以下版本。
  2. 通知图标与透明背景:棒棒糖和以上版本。

现在根据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()

创建一个方法,用于检查我们正在安装应用程序的操作系统版本。如果它低于棒棒糖,即API 21,那么它将采取正常的应用程序图标与背景颜色,否则它将采取透明的应用程序图标没有任何背景。因此,使用操作系统版本>= 21的设备将使用通知生成器类的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;

对于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 (Lollipop 5.0)之前,彩色图标可以工作。您可以强制应用程序以API 20为目标,但这会限制应用程序可用的特性,因此不建议这样做。您可以测试正在运行的API级别,并适当地设置颜色图标或灰度图标,但这可能不值得。在大多数情况下,最好使用灰色图标。

图像有四个通道,RGBA(红/绿/蓝/ alpha)。对于通知图标,Android忽略R、G和B通道。唯一重要的通道是Alpha,也称为不透明度。用编辑器设计图标,让您可以控制绘图颜色的Alpha值。

Alpha值如何生成灰度图像:

  • Alpha = 0(透明)-这些像素是透明的,显示背景颜色。
  • Alpha = 255(不透明)-这些像素是白色的。
  • Alpha = 1…254 -这些像素正是你所期望的,提供透明和白色之间的阴影。

setColor改变它:

  • < p > NotificationCompat.Builder.setColor(int argb)打电话。来自Notification.color的文档:

    强调色(与颜色中的常量类似的ARGB整数)将在显示此通知时由标准样式模板应用。当前的模板设计通过将图标图像(白色模板)覆盖在该颜色的字段之上来构造一个彩色的标题图像。Alpha分量被忽略。

    我用setColor进行的测试显示Alpha组件被忽略。较高的Alpha值使像素变白。较低的Alpha值将通知区域中的一个像素变成背景颜色(我的设备上是黑色),或在下拉通知中变成指定的颜色

修复此问题的要求:

  1. 图片格式:32位PNG(带alpha)

  2. 图像应该是透明的

  3. 透明度颜色指数:白色(FFFFFF)

来源:http://gr1350.blogspot.com/2017/01/problem-with-setsmallicon.html

最后我得到了这个问题的解决方案。

此问题仅发生在应用程序根本没有运行时。(既不在背景也不在前景)。当应用程序在前台或后台运行,通知图标显示正常。(不是白色方块)

所以我们要设置的是在后端api中通知图标的配置与Frontend相同。

在前端,我们使用了反应本地,对于推送通知,我们使用了NPM包

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包,使用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 Manifest中声明这段代码:

<meta-data android:name="com.google.firebase.messaging.default_notification_icon"


android:resource="@drawable/ic_stat_name" />

我也面临着同样的问题,我尝试了很多答案,但没有得到任何解决方案,最后我找到了解决问题的方法。

  • 制作背景透明的通知图标。应用程序的宽度和高度必须像下面的大小,并将所有这些粘贴到你的项目->app->src->main->res

  • < p > MDPI 24 * 24

  • < p > HDPI 36 * 36

  • < p > XHDPI 48 * 48

  • < p > XXHDPI 72 * 72


在上面粘贴这个在你的onmessagerreceived方法下面行


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());

不要忘记在manifest文件中添加此代码

<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/app_icon" />

当你想保留彩色图标时-工作区
在图标中添加颜色略有不同的像素。在我的情况下,有黑色图标的阴影和光。当添加深蓝色像素它的工作。

如果你正在使用谷歌云消息,那么这个问题不会被解决通过简单地改变你的图标。例如,这将不起作用:

 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上也有类似的问题。尝试使用白色图标资源。当我试图使用彩色图像图标时,我有白色正方形,当我将其替换为白色图标时,它开始工作。

我找到了一个链接,在那里我们可以生成自己的白色图标,

尝试这个链接来生成启动器图标的白色图标。

打开这个链接并上传你的ic_launcher或通知图标

我已经通过添加以下代码来解决这个问题,

    <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" />

在Android Studio上创建的ic_stat_name右键单击res >>新建>>图像资产>> 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"应该在manifest上设置相同。

如果你正在使用最新版本的Android Studio,你可以生成你的通知图像。右键单击您的res文件夹 >新比;形象资产。然后你会看到如下图所示的配置镜像资产。将图标类型更改为通知图标。你的图像必须是白色和透明的。配置镜像资产将强制执行该规则。 Configure Image Assets 如果你想让图标用于云/推送通知,你必须在你的应用程序标签下添加元数据来使用新创建的通知图标。

  <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" />


......

删除图标的背景使用任何网站,建议一个是https://www.remove.bg/ 然后在下载后使用该图像,您的问题将得到解决