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

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(两者都

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

我尝试过调整图标的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仅在棒棒糖中可用,它只影响图标的背景。

它将彻底解决您的问题

我真的建议如下:
上面写着“通知图标必须完全是白色的。”

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

  • 正常通知图标:用于以下棒棒糖版本
  • 带有透明背景的通知图标:用于棒棒糖及以上版本
  • 现在,根据操作系统版本在运行时为notification builder设置适当的图标:

    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)
      。从
      Notification.color
      的文档中:

      显示此通知时由标准样式模板应用的强调色(类似于颜色中的常量的ARGB整数)。当前模板设计通过将图标图像(用白色模版打印)覆盖在该颜色字段的顶部来构造彩色标题图像。忽略Alpha组件

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


    • 解决此问题的要求:

    • 图像格式: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" />
      
      ......