Android Push Notifications: Піктограма не відображається в повідомленні, натомість показано білий квадрат


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

без відкриття повідомлення сповіщення відкрито




виправили це питання? я все ще стикаюся з тим же питанням, у верхній смузі стану все ще відображається пробіл для сповіщення, якщо я додаю прозоре зображення
AngelJanniee

Так, я виправив це, створивши прозорий значок або націлюючи SDK версії 20 або новішої. Якщо це не вирішує для вас, можливо, у вашої подібної проблеми є інша причина. Я пропоную встановити цільову версію SDK на 20 та перевірити, чи це щось змінить. Якщо це не так, не впевнений, чи може це питання вам допомогти :(
Blueriver

Відповіді:


188

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

Якщо ми вирішимо проблему з білими значками, встановивши цільовий пакет SDK на 20, наш додаток не націлюватиметься на Android Lollipop, а це означає, що ми не можемо використовувати функції, характерні для 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)

Реалізація 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 і впливає лише на фон піктограми.

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


Нічого, дякую. Я думав, що вони повинні бути повністю білими, оскільки в деяких додатках у мене є кольорові значки. Тепер я бачу причину. Дякую!
Блуерівер

3
Сказавши targetSdkVersion 20 , ти врятував мені день! дуже дякую.
Аршад Алі

11
Його погана форма - встановити для targetSDK версію <21 лише заради піктограм. Краще , щоб виправити це правильний шлях, як описано в цій відповіді: stackoverflow.com/questions/27343202 / ...
user90766

1
але у фоновому режимі, коли додатка немає у стеці, він показує білі значки, що робити, щоб у будь-якому випадку отримати такий же результат
Пратік В’яс

1
Я спробував все, але це не працює. вона все ще показує крапку з кольоровою згадкою у файлі маніфесту
Harsh Shah

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 є прозорим і білим. Це також повинно бути визначено в метаданих Manifest, наприклад:

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

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

Метадані переходять під applicationтег, для довідки.


6
Велике спасибі за підказку з метаданими всередині маніфесту.
Євген Тімм

як розмістити "@ dravable / ic_notification"? це одна ікона? багато? це PNG?
Лука Пігетті

1
@LukePighetti це може бути багато, якщо ви завантажуєте зображення різного розміру для кількох роздільних можливостей екрана. В іншому випадку, так, це може бути один файл PNG у вашій мальованій теці.
Ruchir Baronia

1
@RuchirBaronia так для наведеного вище прикладу res/drawable/ic_notification.pngрозміром 196x196?
Лука Пігетті

thx @RuchirBaronia, запропонований для Meta-dataпропозиції тегів.
Раві Ванія

37

Я дійсно пропоную дотримуватися Правил дизайну Google :

де написано: "Значки сповіщень повинні бути повністю білими".


2
Ваша відповідь навіть краща за ту, яку я прийняв. Бажаю, щоб я міг прийняти і ваших. Я не можу, але у вас є моя +1 і моя вдячність. Ура!
Блуерівер

2
Це не дуже хороша відповідь. Що робити, якщо зацікавлені сторони проекту повинні орієнтуватися на Android 7? Я не можу просто націлити будь-яку версію SDK до цього.
Неонова воїна

1
Відповідач відповів, що це неправильно. Опитуючий каже, що я не в змозі запустити свою програму на sdk21. Відповідь говорить: "dont use sdk 21"
Utsav Gupta

1
Це справді не рішення.
Хосе Гомес

1
Я не можу знайти нічого в нинішніх інструкціях щодо дизайну, які б вказували, що значок повинен бути білим на прозорому тлі. Незалежно від бідної документації, все одно, мабуть, так і є.
imagio

29

Декларуйте цей код в Android Manifest:

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

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

Я сподіваюся, що це вам корисно.


О Боже! Цей ідеально підходить для push-сповіщень FCM! Спасибі
Кроно

1
Куди ви розміщуєте ic_stat_name? Це один png? чи багато? будь ласка, допоможіть!
Люк Пігетті

3
@Luke Pighetti У студії Android клацніть правою кнопкою миші на додаток >> Нове >> Активність зображення >> IconType (Повідомлення)
vicky mahale

1
(Я знаю, що минув час, але) Не могли б ви пояснити це? Що це робити? Чи надає повнокольоровий непрозорий значок чи що?
afe

Це правильна відповідь на повідомлення хмарних повідомлень Firebase.
Грег Елліс

11

(Android Studio 3.5) Якщо ви остання версія Android Studio, ви можете генерувати свої сповіщення. Клацніть правою кнопкою миші на вашій папці res > New> Актив зображення . Потім ви побачите Налаштування активів зображення, як показано на зображенні нижче. Змініть тип значка на піктограми сповіщень . Ваші зображення повинні бути білими і прозорими. Це налаштування активів зображення буде застосовувати це правило. Важливо: Якщо ви хочете, щоб піктограми використовувались для хмарних / push-сповіщень, ви повинні додати метадані під тег програми, щоб використовувати новостворені піктограми сповіщень.Налаштування активів зображення

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

10

Ми можемо зробити так, як нижче:

Створіть новий об’єкт конструктора сповіщень та зателефонуйте setSmallIcon() використовуючи як у наведеному нижче коді.

Створіть метод, за допомогою якого ми перевіримо, в якій версії ОС ми встановлюємо наш додаток. Якщо він знаходиться нижче Lolipop, тобто API 21, він візьме звичайний значок додатка з кольором тла, інакше знадобиться прозорий значок програми без будь-якого фону. Тож пристрої, що використовують версію os> = 21, встановлять колір фону піктограми за допомогою методуsetColor() класу Builder Notification.

Приклад коду:

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

Я тестував setColorна Kitkat (API 19) та IceCreamSandwich (API 15), в обох випадках він ігнорував колір, але не вийшов з ладу . Тож чи можу я безпечно пропустити перевірку версії ОС?
Марія

10

Спробуйте це

Я зіткнувся з тим же питанням, я спробував багато відповідей, але не знайшов жодного рішення, нарешті, я знайшов спосіб вирішити свою проблему.

- зробіть значок сповіщення з прозорим фоном. Ширина та висота програми повинні бути приблизно розмірами та вставити все це у ваш проект-> додаток-> 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

Якщо ви хочете надати піктограму сповіщення про підтримку льодяника, тоді створіть два значки сповіщення:

  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

Нарешті я отримав рішення для цього питання.

Ця проблема виникає лише тоді, коли програма зовсім не працює. (ні на задньому плані, ні на передньому плані) . Коли програма працює на передньому плані чи на тлі, значок сповіщення відображається належним чином (не білий квадрат)

Отже, ми повинні встановити ту саму конфігурацію піктограми сповіщень у API Backend, що і у Frontend.

У передній частині ми використовували React Native, а для сповіщення про 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, використовуючи 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"
  }
}

Що в основному шукає зображення notifyicon, що зберігається локально в нашій системі Android.


1
Ваше питання ДУЖЕ відрізняється від мого, хоча воно має той же ефект. Дякуємо, що опублікували цю відповідь, можливо, це допоможе тому, хто використовує той самий стек технологій, який ви використовуєте.
Блюерівер

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

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

спробуйте це посилання, щоб створити білий значок піктограми запуску.

Відкрийте це посилання та завантажте іконку 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();

1

Щоб зменшити специфічні версії SDK, ви можете просто зробити це: (замінити "#" на "0x")

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

0xFF169AB9, вам не вистачає повністю непрозорого альфа-каналу.
Євген

0

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


0

У мене є аналогічне питання на android 8.0. Спробуйте використовувати БІЛИЙ ресурс значків. У мене білий квадрат, коли я намагаюся використовувати кольорове зображення для піктограми, коли я замінюю його на білий значок, воно починає працювати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.