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

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

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

16 ответов


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

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

решение для целевого Sdk 21

Если вы хотите поддержать значки материала леденца, то сделайте прозрачные значки для леденца и выше версии. Обратиться следующий: 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 будет:

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, и это влияет только на фоне значка.

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


Если вы используете 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 тег, для справки.


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

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


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

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

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

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


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

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

создайте метод, в котором мы проверим, на какой версии ОС мы устанавливаем наше приложение . Если это ниже Lolipop i.E 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;
}

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

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

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

в frontend мы использовали Реагировать Уроженца и для push-уведомления мы использовали 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 пакет используя узел.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"
  }
}

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


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

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

теперь установите соответствующий значок в 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);
}

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

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

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

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

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

изменение его с setColor:

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

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

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


попробуй такое

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

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

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

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

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

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

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


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

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

добавить эту строку в манифест.XML-файл в блок


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

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

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

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

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


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


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