Push-уведомления Android: значок не отображается в уведомлении, вместо него отображается белый квадрат

Мое приложение генерирует уведомление, но значок, который я установил для этого уведомления, не отображается. Вместо этого я получаю белый квадрат.

Я попытался изменить размер значка png (размеры 720x720, 66x66, 44x44, 22x22). Любопытно, что при использовании меньших размеров белый квадрат меньше.

Я столкнулся с этой проблемой, а также правильным способом генерации уведомлений, и из того, что я прочитал, мой код должен быть правильным. К сожалению, все не так, как должно быть.

Мой телефон - Nexus 5 с Android 5.1.1. Проблема также проявляется в эмуляторах Samsung Galaxy s4 с Android 5.0.1 и Motorola Moto G с Android 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);
}

without opening the notificationnotifications opened

Ответ 1

Причина: для версии 5.0 Lollipop "Значки уведомлений должны быть полностью белыми".

Если мы решим проблему с белым значком, установив целевой SDK равным 20, наше приложение не будет ориентирован на Android Lollipop, что означает, что мы не можем использовать Особенности леденца на палочке.

Решение для цели Sdk 21

Если вы хотите поддерживать Lollipop Material Icons, сделайте прозрачные иконки для Lollipop и выше. Пожалуйста, обратитесь ниже: 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)

Реализация Notification Builder для версий Lollipop 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 доступен только в Lollipop и влияет только на фон значка.

Это решит вашу проблему полностью !!

Ответ 2

Если вы используете 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.

Ответ 3

Я действительно предлагаю следовать правилам дизайна Google:

на котором написано "Значки уведомлений должны быть полностью белыми".

Ответ 4

Объявите этот код в манифесте Android:

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

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

Я надеюсь, что это будет полезно для вас.

Ответ 5

Мы можем сделать, как показано ниже:

Создайте новый объект построителя уведомлений и вызовите setSmallIcon() с помощью объекта построителя уведомлений, как в приведенном ниже коде.

Создайте метод, в котором мы будем проверять, какую версию ОС мы устанавливаем в нашем приложении. Если он ниже Lolipop i.e API 21, тогда он примет обычную иконку приложения с цветом фона, иначе он примет прозрачный значок приложения без какой-либо подготовки. Таким образом, устройства, использующие os version >= 21, будут устанавливать цвет фона значка с помощью метода setColor() класса 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;
}

Ответ 6

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

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

добавьте эту строку в файл manifest.xml в блоке приложения

Ответ 7

Если вы хотите предоставить значок уведомления о поддержке Lollipop, введите два значка уведомления типа:

  • значок обычного уведомления: для версии ниже леденца.
  • значок уведомлений с прозрачным фоном: для леденца и выше.

Теперь установите соответствующий значок в конструктор уведомлений во время выполнения в версии ОС:

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

Ответ 8

Наконец-то у меня есть решение этой проблемы.

Эта проблема возникает только тогда, когда приложение вообще не работает. (ни на заднем плане, ни на переднем плане). Когда приложение работает на переднем или на заднем плане, значок уведомления отображается правильно. (Не белый квадрат)

Итак, мы должны установить ту же конфигурацию для значка уведомлений в Backend API, что и в Frontend.

Во внешнем интерфейсе мы использовали React Native, а для push-уведомлений мы использовали response-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 в качестве бэкэнда для push-уведомлений, и установили структуру полезной нагрузки следующим образом.

{
  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.

Ответ 9

Попробуйте

i столкнулась с такой же проблемой, я много раз пробовал, но не получал никаких решений, наконец, нашел способ решить мою проблему.

- сделать значок уведомлений с прозрачным фоном. Размер и высота приложения должны быть примерно равными размерам и вставлять все это в ваш проект- > приложение- > 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" />

Ответ 10

Уведомления greyscale, как описано ниже. Они не черно-белые, несмотря на то, что написали другие. Вероятно, вы видели значки с несколькими оттенками, например, полосы прочности сети.

До API 21 (Lollipop 5.0) работают значки цветов. Вы можете заставить приложение использовать таргетинг API 20, но это ограничивает возможности, доступные вашему приложению, поэтому его не рекомендуется. Вы можете протестировать уровень API-интерфейса и установить либо значок цвета, либо значок оттенка серого, но это, вероятно, не стоит. В большинстве случаев лучше всего использовать значок оттенков серого.

Изображения имеют четыре канала, RGBA (красный/зеленый/синий/альфа). Для значков уведомлений Android игнорирует каналы R, G и B. Единственным каналом, который считается, является Alpha, также известный как непрозрачность. Создайте свой значок с помощью редактора, который дает вам контроль над значением Alpha ваших цветов чертежа.

Как значения альфа генерируют изображение в оттенках серого:

  • Alpha = 0 (прозрачный) - эти пиксели прозрачны, отображая цвет фона.
  • Alpha = 255 (непрозрачный) - эти пиксели белые.
  • Alpha = 1... 254 - Эти пиксели именно то, что вы ожидаете, обеспечивая оттенки между прозрачным и белым.

Изменение его с помощью setColor:

  • Вызов NotificationCompat.Builder.setColor(int argb). Из документации для Notification.color:

    Цвет акцента (целое число ARGB, такое как константы в цвете), которое будет применяться стандартными шаблонами стиля при представлении этого уведомления. Текущая конструкция шаблона создает красочное изображение заголовка, накладывая изображение значка (трафаретное в белом) на поле этого цвета. Альфа-компоненты игнорируются.

    Мое тестирование с помощью setColor показывает, что компоненты Alpha не игнорируются. Более высокие значения Alpha отображают белый цвет. Значения Lower Alpha превращают пиксель в цвет фона (черный на моем устройстве) в области уведомлений или в указанный цвет в раскрывающемся уведомлении.

Ответ 11

Я нашел ссылку, где мы можем создать наш собственный белый значок,

Попробуйте эту ссылку, чтобы создать белый значок вашего значка запуска.

Откройте эту ссылку и загрузите свой ic_launcher или значок уведомления

Ответ 12

Я решил проблему, добавив приведенный ниже код в манифест,

    <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 >> Новый >> Активы изображений >> 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" должно быть одинаковым в манифесте.

Ответ 13

Требования для устранения этой проблемы:

  • Формат изображения: 32-разрядный PNG (с альфа)

  • Изображение должно быть прозрачным

  • Индекс цвета прозрачности: белый (FFFFFF)

Источник: http://gr1350.blogspot.com/2017/01/problem-with-setsmallicon.html

Ответ 14

(Android Studio 3.5) Если вы используете последнюю версию Android Studio, вы можете создавать изображения для уведомлений. Щелкните правой кнопкой мыши по папке res >Создать> Актив изображения. Затем вы увидите Configure Image Assets, как показано на изображении ниже. Измените Тип значка на Значки уведомлений. Ваши изображения должны быть белыми и прозрачными. Эта настройка активов изображения будет применять это правило. Configure Image Assets Важно: Если вы хотите, чтобы значки использовались для облачных/push-уведомлений, необходимо добавить метаданные под тегом приложения, чтобы использовать вновь созданные значки уведомлений.

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

Ответ 15

Вы можете использовать различный значок для разных версий. Просто установите логику на свой значок следующим образом:

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

Ответ 16

Для 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();

Ответ 17

Если вы хотите сохранить красочный значок - Обходное решение
Добавьте пиксель с немного другим цветом в значок.
В моем случае есть черный значок с оттенками и светом. При добавлении синего пикселя он работает.

Ответ 18

У меня есть аналогичная проблема на Android 8.0. Попробуйте использовать БЕЛЫЙ значок ресурса. У меня белый квадрат, когда я пытаюсь использовать цветное изображение для значка, когда я заменяю его на белый значок, он начинает работать.

Ответ 19

Чтобы уменьшить количество версий, специфичных для SDK, вы можете просто сделать это: (заменить '#' на '0x')

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