Android的推送通知:图标在通知没有显示,而是显示白色正方形Android的推送通知:图标在通知

2019-05-10 12:46发布

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

我试图调整大小的图标(尺寸720x720,66x66,44x44,22×22)的PNG。 奇怪的是,使用更小的尺寸时,白色方形较小。

我用Google搜索这个问题,以及生成通知的正确方法,并从我读过我的代码应该是正确的。 不幸的是,事情并不像他们应该。

我的手机是一台Nexus 5采用Android 5.1.1。 问题也出现在模拟器中,三星Galaxy S4搭载Android 5.0.1和摩托罗拉摩托罗拉采用Android 5.0.1(这两者我借来的,并没有现在)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);
}

Answer 1:

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

如果我们的目标SDK设置为20解决白色图标的问题,我们的应用程序将不会适用于Android棒棒糖,这意味着我们可以不使用特定棒棒糖功能。

解决方案的目标SDK 21

如果你想支持棒棒堂材质的图标,然后作出棒棒糖及以上版本的透明图标。 请参考以下内容: https://design.google.com/icons/

请看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#setColor(int)

通知生成器的下面和上面的棒棒糖OS版本的实现是:

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仅在棒棒糖可用,但只影响到该图标的背景。

这将彻底解决您的问题!



Answer 2:

如果您使用的是谷歌云消息,那么这个问题就不会被简单地改变你的图标解决 。 例如,这是不行的:

 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是TRANSPARANT和白色。 它必须在清单元数据也定义,就像这样:

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

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

下元数据云application的标签,以供参考。



Answer 3:

我真的建议下谷歌的设计准则 :

它说“通知图标必须是全白了。”



Answer 4:

声明在Android清单的代码:

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

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

我希望这对你有用。



Answer 5:

我们可以做如下图所示:

创建通知建设者和呼叫的新对象setSmallIcon()使用的通知生成器对象像下面的代码。

创建我们将检查其操作系统版本,我们正在安装我们的应用程序的方法。 如果低于棒棒糖即,API 21然后它会采取与背景颜色正常的应用程序图标否则将采取透明的应用程序图标没有任何背景。 因此,使用OS版本> = 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;
}


Answer 6:

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

只有当应用程序没有运行在所有出现此问题。 (均未在背景也不在前台)。应用程序上前景或背景运行正确显示通知图标 。(不是白色正方形)

所以,我们所设定是在API的后端作为前端的通知图标相同的配置。

在前端,我们使用原生的反应和推送通知我们使用反应母语-FCM 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-推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图像。



Answer 7:

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

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

在应用程序块的manifest.xml文件中加入这一行



Answer 8:

如果你湾提供棒棒糖支持通知图标,然后做两个类型通知图标:

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


Answer 9:

试试这个

我面临着同样的问题,我想很多anwers,但没有得到任何解决方案,终于让我找到解决我的问题的方式。

- 让与透明背景.The应用程序的宽度通知图标和高度必须像下面的大小和粘贴所有这些在你的项目 - > APP-> SRC-> main->水库

  • MDPI 24 * 24

  • 华电国际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" />


Answer 10:

通知是灰度解释如下。 他们不是非黑即白,不管别人怎么写了。 你可能已经看到有多种色调,如网络强度条的图标。

此前API 21(棒棒堂5.0),彩色图标的工作。 你可能会迫使你的应用程序为目标的API 20,但限制可用的功能,以您的应用程序,所以不推荐使用。 您可以测试运行的API级别,并适当设置无论是颜色图标或灰度图标,但是这很可能是不值得的。 在大多数情况下,最好是去同一个灰度图标。

图像有四个通道,RGBA(红/绿/蓝/阿尔法)。 对于通知图标,机器人忽视了R,G和B通道。 唯一重要的渠道是阿尔法,也被称为透明度。 与让您的绘图颜色的阿尔法值控制的编辑器设计你的图标。

如何阿尔法值产生灰度图像:

  • 阿尔法= 0(透明) - 这些像素是透明的,示出了背景色。
  • 阿尔法= 255(不透明) - 这些像素是白色的。
  • 阿尔法= 1 ... 254 - 这些像素是你所期望的到底是什么,提供透明的和白色的色调。

了改变它setColor

  • 呼叫NotificationCompat.Builder.setColor(int argb) 从文档Notification.color

    强调色(一个ARGB整数像颜色的常量),以由标准样式模板呈现该通知时被应用。 当前模板设计通过顶上这种颜色的场重叠的图标图像(白色钢印)构造一个多彩头图像。 阿尔法成分被忽略。

    我用的setColor测试表明,alpha分量不容忽视。 较高的阿尔法值变成一个像素的白色。 低的α值变成一个像素到在通知区域中的背景色(我的设备上黑色),或在下拉通知指定的颜色。



Answer 11:

要求解决这个问题:

  1. 图像格式:32位PNG(阿尔法)

  2. 图片应该是透明的

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

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



Answer 12:

我发现了一个链接,我们可以创造我们自己的白色图标,

尝试此链接生成您的启动器图标的白色图标。

打开此链接 ,并上传你的ic_launcher或通知图标



Answer 13:

你可以用不同的图标不同版本。 只需设置逻辑上的图标是这样的:

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


Answer 14:

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


Answer 15:

当你想保留彩色图标-解决方法
添加像素略有不同的颜色分为图标。
在我的情况下,有阴影和浅黑色图标。 当加入深蓝像素它的工作原理。



Answer 16:

我已经在Android 8.0类似的问题。 尝试用白色的图标资源。 我有当我尝试使用彩色图像图标,当我把它替换成白色图标白色方块,它的开始工作。



Answer 17:

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

    <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 Push Notifications: Icon not displaying in notification, white square shown instead