it-swarm.com.ru

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

123
Blueriver

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

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

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

146
Garima Mathur

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

32
Ruchir Baronia

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

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

19
N J

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

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

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

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

15
vicky mahale

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

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

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

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

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

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

Во внешнем интерфейсе мы использовали React Native, а для push-уведомлений мы использовали -act-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 package используя 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.

7
Aniruddha Shevle

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

  1. обычный значок уведомления: для версии ниже Lollipop. 
  2. значок уведомления с прозрачным фоном: для 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);
}
6
Haresh Chhelana
 <meta-data Android:name="com.google.firebase.messaging.default_notification_icon"

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

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

6
Sajidh Zahir

Попробуй это

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

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

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

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

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

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

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

3
user7478049

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

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

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

3
Ghanshyam Nayma

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

До 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 превращают пиксель в белый цвет. Более низкие значения альфа-канала превращают пиксель в цвет фона (черный на моем устройстве) в области уведомлений или в указанный цвет в раскрывающемся уведомлении.

3
Jeremy Frank

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

int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop ? R.drawable.colored_: R.drawable.white_tint_icon_for_lolipop_or_upper;
1
Md. Al- Rasel

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

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

0
Vouskopes

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

0
Zeon

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

    <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 >> New >> Image Assets >> 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" должно быть таким же, как и в манифесте.

0
Haris