Notifications push Android: l'icône ne s'affiche pas dans la notification, carré blanc affiché à la place

179

Mon application génère une notification, mais l'icône que j'ai définie pour cette notification ne s'affiche pas. Au lieu de cela, j'obtiens un carré blanc.

J'ai essayé de redimensionner le png de l'icône (dimensions 720x720, 66x66, 44x44, 22x22). Curieusement, lorsque vous utilisez des dimensions plus petites, le carré blanc est plus petit.

J'ai recherché ce problème sur Google, ainsi que la manière correcte de générer des notifications, et d'après ce que j'ai lu, mon code devrait être correct. Malheureusement, les choses ne sont pas comme elles devraient être.

Mon téléphone est un Nexus 5 avec Android 5.1.1. Le problème est également présent sur les émulateurs, un Samsung Galaxy s4 avec Android 5.0.1 et un Motorola Moto G avec Android 5.0.1 (que j'ai emprunté et que je n'ai pas pour le moment)

Le code des notifications suit et deux captures d'écran. Si vous avez besoin de plus d'informations, n'hésitez pas à les demander.

Merci à tous.

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

sans ouvrir la notification notifications ouvertes

Blueriver
la source
4
Le double possible de l' icône de la barre
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Voici un travail autour de stackoverflow.com/a/39142981/1939564
Muhammad Babar
avez résolu ce problème? Je suis toujours confronté au même problème, dans la barre d'état supérieure, montrant toujours l'espace blanc pour la notification si j'ajoute l'image transparente
AngelJanniee
Oui, je l'ai corrigé en créant une icône transparente ou en ciblant la version 20 ou inférieure du SDK. Si cela ne résout pas le problème pour vous, votre problème similaire a peut-être une cause différente. Je suggère de définir la version cible du SDK sur 20 et de vérifier si cela change quelque chose. Si ce n'est pas le cas, je ne sais pas si cette question peut vous aider :(
Blueriver

Réponses:

188

Cause: Pour 5.0 Lollipop "Les icônes de notification doivent être entièrement blanches".

Si nous résolvons le problème de l'icône blanche en définissant le SDK cible sur 20, notre application ne ciblera pas Android Lollipop, ce qui signifie que nous ne pouvons pas utiliser les fonctionnalités spécifiques à Lollipop.

Solution pour la cible Sdk 21

Si vous souhaitez prendre en charge les icônes de matériau Lollipop, créez des icônes transparentes pour Lollipop et la version supérieure. Veuillez vous référer à ce qui suit: https://design.google.com/icons/

Veuillez consulter http://developer.android.com/design/style/iconography.html , et nous verrons que le style blanc est la façon dont les notifications sont censées être affichées dans Android Lollipop.

Dans Lollipop, Google suggère également d'utiliser une couleur qui sera affichée derrière l'icône de notification blanche. Reportez-vous au lien: https://developer.android.com/about/versions/android-5.0-changes.html

Partout où nous voulons ajouter des couleurs https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#setColor(int)

La mise en œuvre de Notification Builder pour la version inférieure et supérieure du système d'exploitation Lollipop serait:

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

Remarque: setColor n'est disponible que dans Lollipop et n'affecte que l'arrière-plan de l'icône.

Cela résoudra complètement votre problème !!

Garima Mathur
la source
Wow merci. Je pensais qu'ils DEVRAIENT être entièrement blancs, car certaines applications que j'ai sur mon téléphone ont des icônes de couleur. Maintenant je vois la raison. Je vous remercie!
Blueriver
3
En disant targetSdkVersion 20 , vous avez sauvé ma journée! Merci beaucoup.
Arshad Ali
11
C'est une mauvaise forme de définir la version targetSDK à <21 juste pour des icônes. Il est préférable de le corriger de la bonne manière, comme décrit dans cette réponse: stackoverflow.com/questions/27343202/…
user90766
1
mais en arrière-plan lorsque l'application n'est pas dans la pile, elle affiche les icônes blanches, que faire pour obtenir le même résultat dans tous les cas
Pratik Vyas
1
J'ai tout essayé mais ça ne marche pas. il affiche toujours un point avec une mention de couleur dans le fichier manifeste
Harsh Shah
67

Si vous utilisez Google Cloud Messaging, ce problème ne sera pas résolu en modifiant simplement votre icône. Par exemple, cela ne fonctionnera pas:

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

Même si ic_notification est transparent et blanc. Il doit également être défini dans les métadonnées du manifeste, comme ceci:

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

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

Les méta-données passent sous l' applicationétiquette, pour référence.

Ruchir Baronia
la source
6
Un grand merci pour l'indication avec les métadonnées à l'intérieur du manifeste.
Eugen Timm
comment placez-vous "@ drawable / ic_notification"? est-ce une icône? beaucoup? est-ce PNG?
Luke Pighetti
1
@LukePighetti il ​​peut y en avoir beaucoup si vous téléchargez des images de tailles différentes pour plusieurs résolutions d'écran. Sinon, oui, il peut s'agir d'un seul fichier PNG sur votre répertoire dessinable.
Ruchir Baronia
1
@RuchirBaronia donc pour l'exemple ci-dessus res/drawable/ic_notification.pngde taille 196x196?
Luke Pighetti
merci @RuchirBaronia, voté pour la Meta-datasuggestion de balise.
Ravi Vaniya
37

Je suggère vraiment de suivre les directives de conception de Google :

qui dit "Les icônes de notification doivent être entièrement blanches."

New Jersey
la source
2
Votre réponse est encore meilleure que celle que j'ai acceptée. J'aimerais pouvoir accepter le vôtre aussi. Je ne peux pas, mais vous avez mon +1 et ma gratitude. À votre santé!
Blueriver
2
Ce n'est pas une très bonne réponse. Et si, les parties prenantes du projet devaient cibler Android 7? Je ne peux pas cibler n'importe quelle version du SDK avant cela.
Neon Warge
1
Cette réponse a été rejetée car elle est erronée. Le questionneur dit que je ne suis pas en mesure d'exécuter mon application sur sdk21. La réponse dit "ne pas utiliser sdk 21"
Utsav Gupta
1
Ce n’est vraiment pas une solution.
Jose Gómez
1
Je ne trouve rien dans les directives de conception actuelles qui spécifient que l'icône doit être blanche sur un fond transparent. Indépendamment de la mauvaise documentation, cela semble toujours être le cas.
imagio
29

Déclarez ce code dans le manifeste Android:

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

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

J'espère que cela vous sera utile.

vicky mahale
la source
Oh mon! Celui-ci fonctionne parfaitement pour les notifications push FCM! Merci
Crono
1
Où placez-vous ic_stat_name? S'agit-il d'un png? est-ce beaucoup? aidez s'il vous plaît!
Luke Pighetti
3
@Luke Pighetti Dans Android Studio Cliquez avec le bouton droit sur l'application >> Nouveau >> Actifs d'image >> IconType (Notification)
vicky mahale
1
(Je sais que ça fait un moment mais) Pouvez-vous expliquer cela? Que doit-il faire? Rend-il l'icône non transparente en couleur ou quoi?
afe
C'est la bonne réponse pour les notifications de messagerie cloud Firebase.
Greg Ellis le
11

(Android Studio 3.5) Si vous utilisez une version récente d'Android Studio, vous pouvez générer vos images de notification. Faites un clic droit sur votre dossier res > Nouveau> Image Asset . Vous verrez alors Configurer les éléments d'image comme indiqué dans l'image ci-dessous. Changer le type d'icône en icônes de notification . Vos images doivent être blanches et transparentes. Cette configuration des ressources d'image appliquera cette règle. Important: si vous souhaitez que les icônes soient utilisées pour les notifications cloud / push, vous devez ajouter les métadonnées sous votre balise d'application pour utiliser les icônes de notification nouvellement créées.Configurer les éléments d'image

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

On peut faire comme ci-dessous:

Créez un nouvel objet de générateur de notification et appelez à l' setSmallIcon()aide de l'objet générateur de notification comme dans le code ci-dessous.

Créez une méthode dans laquelle nous vérifierons sur quelle version du système d'exploitation nous installons notre application. S'il est inférieur à Lolipop, c'est-à-dire API 21, il prendra l'icône d'application normale avec la couleur d'arrière-plan, sinon l'icône d'application transparente sans arrière-plan. Ainsi, les appareils utilisant la version os> = 21 définiront la couleur d'arrière-plan de l'icône en utilisant la méthode setColor()de la classe de générateur de notification.

Exemple de code:

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;
}
rahul sharma
la source
J'ai testé setColorsur Kitkat (API 19) et IceCreamSandwich (API 15), dans les deux cas, il a ignoré la couleur mais ne s'est pas écrasé . Alors, puis-je en toute sécurité omettre de vérifier la version du système d'exploitation?
Maria
10

Essaye ça

J'étais confronté au même problème, j'ai essayé beaucoup de réponses mais je n'ai obtenu aucune solution, j'ai finalement trouvé le moyen de résoudre mon problème.

- créer une icône de notification avec un fond transparent.La largeur et la hauteur de l'application doivent être comme ci-dessous et collez tout cela dans votre projet-> app-> src-> main-> res

  • MDPI 24 * 24

  • HDPI 36 * 36

  • XHDPI 48 * 48

  • XXHDPI 72 * 72


après ce qui précède, collez cette ligne ci-dessous dans votre méthode 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());

N'oubliez pas d'ajouter ce code dans le fichier manifeste

<meta-data 
android:name="com.google.firebase.messaging.default_notification_icon" 
android:resource="@drawable/app_icon" />
Sunil
la source
10
 <meta-data android:name="com.google.firebase.messaging.default_notification_icon"

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

ajoutez cette ligne dans le fichier manifest.xml dans le bloc d'application

Sajidh Zahir
la source
7

Si vous souhaitez fournir une icône de notification de support de sucette, créez deux icônes de notification de type:

  1. icône de notification normale: pour la version ci-dessous de la sucette.
  2. icône de notification avec fond transparent: pour sucette et version supérieure.

Maintenant, définissez l'icône appropriée sur le générateur de notification au moment de l'exécution sur la version du système d'exploitation:

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);
}
Haresh Chhelana
la source
7

Enfin, j'ai la solution à ce problème.

Ce problème se produit uniquement lorsque l'application n'est pas du tout en cours d'exécution. (ni en arrière-plan ni au premier plan) . Lorsque l' application s'exécute au premier plan ou en arrière-plan, l'icône de notification s'affiche correctement (pas le carré blanc).

Donc, ce que nous devons définir est la même configuration pour l'icône de notification dans les API backend que celle de Frontend.

Dans le frontend, nous avons utilisé React Native et pour la notification push, nous avons utilisé le package npm react-native-fcm .

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

Nous avons utilisé le package npm fcm-push en utilisant Node.js comme backend pour la notification push et avons défini la structure de la charge utile comme suit.

{
  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"
  }
}

Ce qu'il recherche essentiellement pour l'image notification_icon stockée localement dans notre système Android.

Aniruddha Shevle
la source
1
Votre problème est TRÈS différent du mien, bien qu'il ait le même effet. Merci d'avoir publié cette réponse, cela aidera probablement quelqu'un à utiliser la même pile technologique que vous utilisez.
Blueriver
1
@IanWarburton: Pas besoin.
Aniruddha Shevle
5

Les notifications sont en niveaux de gris comme expliqué ci-dessous. Ils ne sont pas en noir et blanc, malgré ce que d'autres ont écrit. Vous avez probablement vu des icônes avec plusieurs nuances, comme des barres de puissance du réseau.

Avant l'API 21 (Lollipop 5.0), les icônes de couleur fonctionnent. Vous pouvez forcer votre application à cibler l'API 20, mais cela limite les fonctionnalités disponibles pour votre application, ce n'est donc pas recommandé. Vous pouvez tester le niveau d'API en cours d'exécution et définir une icône de couleur ou une icône en niveaux de gris de manière appropriée, mais cela ne vaut probablement pas la peine. Dans la plupart des cas, il est préférable d'utiliser une icône en niveaux de gris.

Les images ont quatre canaux, RGBA (rouge / vert / bleu / alpha). Pour les icônes de notification, Android ignore les canaux R, G et B. Le seul canal qui compte est Alpha, également appelé opacité. Concevez votre icône avec un éditeur qui vous permet de contrôler la valeur alpha de vos couleurs de dessin.

Comment les valeurs alpha génèrent une image en niveaux de gris:

  • Alpha = 0 (transparent) - Ces pixels sont transparents, indiquant la couleur d'arrière-plan.
  • Alpha = 255 (opaque) - Ces pixels sont blancs.
  • Alpha = 1 ... 254 - Ces pixels sont exactement ce à quoi vous vous attendez, fournissant les nuances entre transparent et blanc.

Changer avec setColor:

  • Appelez NotificationCompat.Builder.setColor(int argb). De la documentation pour Notification.color:

    Couleur d'accentuation (un entier ARVB comme les constantes dans Color) à appliquer par les modèles de style standard lors de la présentation de cette notification. La conception actuelle du modèle construit une image d'en-tête colorée en superposant l'image de l'icône (au pochoir en blanc) sur un champ de cette couleur. Les composants alpha sont ignorés.

    Mes tests avec setColor montrent que les composants Alpha ne sont pas ignorés. Des valeurs alpha plus élevées rendent un pixel blanc. Les valeurs alpha inférieures transforment un pixel en couleur d'arrière-plan (noir sur mon appareil) dans la zone de notification ou en couleur spécifiée dans la notification déroulante.

Jeremy Frank
la source
5

J'ai résolu le problème en ajoutant le code ci-dessous au manifeste,

    <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_namecréé sur Android Studio Cliquez avec le bouton droit sur res >> Nouveau >> Éléments d'image >> IconType (Notification)

Et une étape de plus que je dois faire côté serveur php avec la charge utile de notification

$message = [
    "message" => [
        "notification" => [
            "body"  => $title , 
            "title" => $message
        ],

        "token" => $token,

    "android" => [
           "notification" => [
            "sound"  => "default",
            "icon"  => "ic_stat_name"
            ]
        ],

       "data" => [
            "title" => $title,
            "message" => $message
         ]


    ]
];

Notez la section

    "android" => [
           "notification" => [
            "sound"  => "default",
            "icon"  => "ic_stat_name"
            ]
        ]

où le nom de l'icône "icon" => "ic_stat_name"doit être le même que celui du manifeste.

Haris
la source
4

J'ai trouvé un lien où nous pouvons générer notre propre icône blanche,

essayez ce lien pour générer l'icône blanche de votre icône de lanceur.

Ouvrez ce lien et téléchargez votre ic_launcher ou l'icône de notification

Ghanshyam Nayma
la source
1

Vous pouvez utiliser différentes icônes pour différentes versions. Définissez simplement la logique sur votre icône comme ceci:

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

Pour SDK> = 23, veuillez ajouter 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
la source
1

Pour réduire les versions spécifiques du SDK, vous pouvez simplement faire ceci: (remplacez '#' par '0x')

Notification notification = new NotificationCompat.Builder(this);
notification.setSmallIcon(R.drawable.icon_transperent);
notification.setColor(0x169AB9); //for color: #169AB9
Dongkichan
la source
0xFF169AB9, il vous manque le canal alpha totalement opaque.
Eugen Pechanec
0

Lorsque vous souhaitez conserver une icône colorée - Solution de contournement
Ajoutez un pixel de couleur légèrement différente dans l'icône.
Dans mon cas, une icône noire avec des nuances et de la lumière. Lorsqu'il est ajouté pixel bleu foncé, cela fonctionne.

Vouskopes
la source
0

J'ai un problème similaire sur Android 8.0. Essayez d'utiliser la ressource icône BLANCHE. J'ai un carré blanc lorsque j'essaie d'utiliser une image colorée pour l'icône, lorsque je la remplace par une icône blanche, le travail commence.

Zeon
la source