Android推送通知:图标未显示在通知中,而是显示白色正方形


179

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

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

我用谷歌搜索了这个问题,以及生成通知的正确方法,从我的阅读中我的代码应该是正确的。可悲的是事情没有达到应有的状态。

我的手机是带有Android 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);
}

无需打开通知 通知已打开




解决了这个问题?我仍然面临着同样的问题,如果我添加透明图像,则顶部状态栏中的通知仍然会显示空白区域
AngelJanniee

是的,我通过创建透明图标或定位SDK版本20或更低版本来修复它。如果这不能为您解决问题,则可能是您的类似问题有不同的原因。我建议将目标SDK版本设置为20,然后检查是否有任何变化。如果不是的话,不确定这个问题是否可以帮助您:(
Blueriver

Answers:


187

原因:对于5.0棒棒糖,“通知图标必须完全为白色”。

如果我们通过将目标SDK设置为20来解决白色图标问题,则我们的应用将不会以Android Lollipop为目标,这意味着我们无法使用Lollipop特有的功能。

目标SDK 21的解决方案

如果要支持棒棒糖材质图标,则为棒棒糖及更高版本制作透明图标。请参考以下内容:https : //design.google.com/icons/

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

在Lollipop中,Google还建议我们使用一种颜色,该颜色将显示在白色通知图标的后面。请参阅链接: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中可用,并且仅影响图标的背景。

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


哇谢谢你。我以为它们应该完全是白色的,因为我手机上的某些应用程序带有颜色图标。现在我明白了原因。谢谢!
Blueriver

3
通过说targetSdkVersion 20,您救了我的一天!非常感谢。
Arshad Ali

11
仅仅为了图标,将targetSDK版本设置为<21的形式很糟糕。最好以正确的方式修复它,如此答案中所述:stackoverflow.com/questions/27343202/…–
user90766

1
但是在后台,当应用程序不在堆栈中时,它会显示白色图标,无论如何该如何做才能获得相同的结果
Pratik Vyas

1
我尝试了所有操作,但是没有用。它仍在清单文件中显示带有颜色提及的点
Harsh Shah

66

如果您使用的是Google Cloud Messaging,那么仅更改图标就无法解决此问题。例如,这将不起作用:

 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是透明和白色的。还必须在清单元数据中定义它,如下所示:

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

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

元数据位于application标签下,以供参考。


6
非常感谢您对清单中的元数据的提示。
Eugen Timm '18

你如何放置“ @ drawable / ic_notification”?是一个图标吗?许多?是PNG吗?
路加·皮格蒂

1
@LukePighetti如果您要上载不同尺寸的图像以获得多种屏幕分辨率,则可能有很多。否则,可以,它可能是您的可绘制目录上的一个PNG文件。
Ruchir Baronia '18

1
@RuchirBaronia所以上面的示例res/drawable/ic_notification.png尺寸为196x196?
卢克Pighetti

thx @RuchirBaronia,赞成Meta-data标签建议。
拉维·瓦尼亚

37

我真的建议您遵循Google的设计指南

表示“通知图标必须完全为白色。”


2
您的答案甚至比我接受的答案还要好。希望我也能接受你的。我不能,但是您有我的+1和感谢。干杯!
Blueriver 2015年

2
这不是一个很好的答案。如果项目的利益相关者要求以Android 7为目标怎么办?在此之前,我不能只定位任何SDK版本。
霓虹灯Warge'3

1
拒绝了该答案,因为它是错误的。发问者说我不能在sdk21上运行我的应用程序。答案说“不要使用SDK 21”
Utsav Gupta

1
这真的不是解决方案。
JoseGómez'17

1
我在当前的设计指南中找不到任何指定图标在透明背景上必须为白色的内容。尽管文档不佳,但情况似乎仍然如此。
伊玛焦

29

在Android清单中声明以下代码:

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

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

希望对您有用。


天啊!这一功能非常适合FCM推送通知!谢谢
克罗诺

1
你要放在ic_stat_name哪里 是一个png吗?有很多吗 请帮忙!
路加·皮格蒂

3
@Luke Pighetti在Android Studio中右键单击应用>>新>>图像资产>> IconType(通知)
vicky mahale

1
(我知道已经有一段时间了,但是)您能解释一下吗?应该怎么办?它会呈现全彩非透明图标还是什么?
AFE

这是Firebase云消息传递通知的正确答案。
格雷格·埃利斯

10

我们可以像下面这样:

创建通知构建器的新对象并调用 setSmallIcon()使用通知构建器对象进行如下面的代码所示。

创建一个方法,在该方法中我们将检查要安装应用程序的操作系统版本。如果它低于Lolipop,即API 21,则它将使用具有背景色的普通应用程序图标,否则将使用没有任何背景的透明应用程序图标。因此,使用os version> = 21的设备将使用方法设置图标的背景色setColor() Notification builder类的。

样例代码:

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在Kitkat(API 19)和IceCreamSandwich(API 15)上进行了测试,在两种情况下,它都忽略了颜色,但没有崩溃。那么我可以安全地省略检查操作系统版本吗?
玛丽亚

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

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

在应用程序块的manifest.xml文件中添加此行


10

(Android Studio 3.5)如果您是最新版本的Android Studio,则可以生成通知图像。右键单击您的res文件夹 >新建>图像资产。然后,您将看到配置图像资产,如下图所示。将图标类型更改为通知图标。您的图像必须是白色和透明的。此配置映像资产将强制执行该规则。 重要提示:如果希望将图标用于云/推送通知,则必须将元数据添加到应用程序标记下才能使用新创建的通知图标。配置图像资产

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

9

试试这个

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

-制作带有透明背景的通知图标。应用程序的宽度和高度必须与以下尺寸相同,并将所有这些内容粘贴到项目中-> 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" />

7

如果您想提供棒棒糖支持通知图标,请制作两种类型的通知图标:

  1. 正常通知图标:适用于以下棒棒糖版本。
  2. 带有透明背景的通知图标:适用于棒棒糖及以上版本。

现在,基于操作系统版本,在运行时为通知生成器设置适当的图标:

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

7

终于,我有了解决这个问题的方法。

仅当应用程序完全没有运行时,才会发生此问题。(无论是在后台还是在前台)。当应用程序在前台或后台运行时,通知图标会正确显示。(非白色正方形)

因此,我们要设置的是后端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程序包,它使用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图像的。


1
您的问题与我的问题完全不同,尽管效果相同。感谢您发布此答案,它可能会帮助使用您所使用的同一技术堆栈的人。
Blueriver

1
@IanWarburton:不需要。
阿尼鲁达

5

通知是灰度的,如下所述。尽管其他人已经写过,但它们不是黑白的。您可能已经看到带有多种阴影的图标,例如网络强度条。

在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

    呈现此通知时,标准样式模板要应用的重音颜色(ARGB整数,如Color中的常量)。当前的模板设计通过将图标图像(以白色模版)覆盖在此颜色的字段上方来构造彩色标题图像。Alpha组件将被忽略。

    我对setColor的测试表明Alpha组件不会被忽略。较高的Alpha值会使像素变白。较低的Alpha值会将像素变为通知区域中的背景颜色(在我的设备上为黑色),或在下拉通知中变为指定的颜色。


5

我已通过添加以下代码以实现清单来解决了该问题,

    <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 上创建的位置右键单击res >> New >> Image Assets >> IconType(Notification)

我还需要在服务器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"应与清单上的相同。




1

您可以为不同的版本使用不同的图标。只需在图标上设置逻辑,如下所示:

int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.colored_: R.drawable.white_tint_icon_for_lolipop_or_upper;

1

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

1

要减少特定于SDK的版本,只需执行以下操作:(将“#”替换为“ 0x”)

Notification notification = new NotificationCompat.Builder(this);
notification.setSmallIcon(R.drawable.icon_transperent);
notification.setColor(0x169AB9); //for color: #169AB9

0xFF169AB9,您会丢失完全不透明的Alpha通道。
Eugen Pechanec '19

0

当您想要保留彩色图标时-解决方法
将颜色稍有不同的像素添加到图标中。
就我而言,有一个带有阴影和灯光的黑色图标。添加深蓝色像素后,它将起作用。


0

我在android 8.0上有类似的问题。尝试使用WHITE图标资源。我在尝试使用彩色图像作为图标时出现白色正方形,当我将其替换为白色图标时,它开始工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.