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

我已经尝试调整图标的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);
}


当前回答

我们可以这样做:

创建一个通知生成器的新对象,并使用下面代码所示的通知生成器对象调用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;
}

其他回答

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

不同的版本可以使用不同的图标。简单地在图标上设置逻辑,就像这样:

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

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

    <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上的设置相同。

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

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

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

在前端,我们使用了React Native,对于推送通知,我们使用了React - Native -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-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图像。

对于自定义的本地通知,在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" />

......