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

179

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

Я попытался изменить размер 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);
}

без открытия уведомления уведомления открыты

Blueriver
источник
4
Возможный дубликат значка панели уведомлений становится белым в Android 5 Lollipop
Ciro Santilli 法轮功 '病 六四 事件 法轮功
1
Вот работа вокруг stackoverflow.com/a/39142981/1939564
Мухаммед Бабар
сделал эту проблему? Я все еще сталкиваюсь с той же проблемой, в верхней строке состояния по-прежнему отображается
пустое
Да, я исправил это, создав прозрачную иконку или нацелив SDK версии 20 или ниже. Если это не поможет вам, возможно, у вашей схожей проблемы другая причина. Я предлагаю установить целевую версию SDK на 20 и проверить, если это что-то изменит. Если это не так, не уверен, что этот вопрос поможет вам :(
Blueriver,

Ответы:

188

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

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

Решение для целевой СДК 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 и влияет только на фон значка.

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

Гарима Матур
источник
Вау, спасибо. Я думал, что они ДОЛЖНЫ быть полностью белыми, так как некоторые приложения, которые у меня есть на моем телефоне, имеют цветные значки. Теперь я вижу причину. Спасибо!
Blueriver
3
Говоря targetSdkVersion 20 , вы спасли мой день! большое спасибо.
Аршад Али
11
Неправильно устанавливать версию targetSDK на <21 только ради значков. Лучше исправить это правильно, как описано в этом ответе: stackoverflow.com/questions/27343202/…
user90766
1
но в фоновом режиме, когда приложение не в стеке, оно показывает белые значки, что нужно сделать, чтобы получить тот же результат в любом случае
Pratik Vyas
1
Я перепробовал все, но это не работает. это все еще показывает точку с цветным упоминанием в файле манифеста
Суровый Шах
67

Если вы используете 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
Большое спасибо за подсказку с метаданными внутри манифеста.
Евгений Тимм
как вы размещаете "@ drawable / ic_notification"? это один значок? много? это PNG?
Люк Пигетти
1
@ LukePighetti может быть много, если вы загружаете изображения разных размеров для нескольких разрешений экрана. В противном случае, да, это может быть один файл PNG в вашем каталоге для рисования.
Ручир Барония
1
@RuchirBaronia так для приведенного выше примера res/drawable/ic_notification.pngразмером 196x196?
Люк Пигетти
thx @RuchirBaronia, проголосовал за Meta-dataпредложение тега.
Рави Вания
37

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

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

Нью-Джерси
источник
2
Ваш ответ даже лучше, чем тот, который я принял. Хотел бы я принять и твою тоже. Я не могу, но у вас есть мой +1 и моя благодарность. Ура!
Blueriver,
2
Это не очень хороший ответ. Что делать, если заинтересованные стороны проекта должны нацеливаться на Android 7? Я не могу просто настроить таргетинг на любую версию SDK до этого.
Neon Warge
1
Отклонил этот ответ как неправильный. Спрашивающий говорит, что я не могу запустить свое приложение на sdk21. Ответ говорит: «Не используйте SDK 21»
Утсав Гупта
1
Это действительно не решение.
Хосе Гомес
1
Я не могу найти ничего в текущих правилах дизайна, которые указывают, что значок должен быть белым на прозрачном фоне. Независимо от плохой документации это все еще кажется случаем.
Imagio
29

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

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

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

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

Вики Махале
источник
Боже мой! Это прекрасно работает для push-уведомлений FCM! Спасибо
Crono
1
Где вы размещаете ic_stat_name? Это один PNG? это много? пожалуйста помоги!
Люк Пигетти
3
@Luke Pighetti В Android Studio щелкните правой кнопкой мыши на приложении >> Создать >> Активы изображений >> IconType (Уведомление)
Викки Махал,
1
(Я знаю, что это было давно, но) Не ​​могли бы вы объяснить это? Что это должно делать? Рендеринг полноцветного непрозрачного значка или как?
AFE
Это правильный ответ для уведомлений об облачных сообщениях Firebase.
Грег Эллис
11

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

  <application>
      ...
      <meta-data android:name="com.google.firebase.messaging.default_notification_icon"
          android:resource="@drawable/ic_notification" />
olearyj234
источник
10

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

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

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

Попробуй это

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

- сделать значок уведомления с прозрачным фоном. Ширина и высота приложения должны быть такими же, как ниже размеров, и вставить все это в ваш проект-> 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" />
Сунил
источник
10
 <meta-data android:name="com.google.firebase.messaging.default_notification_icon"

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

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

Саджид Захир
источник
7

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

  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

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

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

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

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

То, что он в основном ищет для изображения messages_icon, хранящегося локально в нашей системе Android.

Анируддха Шевле
источник
1
Ваша проблема ОЧЕНЬ отличается от моей, хотя она имеет тот же эффект. Спасибо за публикацию этого ответа, он, вероятно, поможет кому-то, использующему тот же технический стек, который вы используете.
Blueriver
1
@IanWarburton: нет необходимости.
Анируддха Шевле
5

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

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

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

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

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

Изменяя это с setColor:

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

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

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

Харис
источник
4

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

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

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

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

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

user7478049
источник
4

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

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

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

Ганшьям Найма
источник
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();
Caat C
источник
1

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

Notification notification = new NotificationCompat.Builder(this);
notification.setSmallIcon(R.drawable.icon_transperent);
notification.setColor(0x169AB9); //for color: #169AB9
dongkichan
источник
0xFF169AB9Вам не хватает полностью непрозрачного альфа-канала.
Евгений
0

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

Vouskopes
источник
0

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

Zeon
источник