web-dev-qa-db-fra.com

L'icône de la barre de notification devient blanche dans Android 5 Lollipop

J'ai une application affichant des notifications personnalisées. Le problème est que, sous Android 5, la petite icône de la barre de notification est affichée en blanc. Comment puis-je réparer cela?

201
Alejandro Casanova

La réponse acceptée n'est pas (totalement) correcte. Bien sûr, cela fait apparaître les icônes de notification en couleur, mais avec un gros inconvénient - en définissant le SDK cible sur une valeur inférieure à Android Lollipop!

Si vous résolvez le problème de l'icône blanche en définissant votre SDK cible sur 20, comme suggéré, votre application ne ciblera pas Android Lollipop, ce qui signifie que vous ne pourrez pas utiliser les fonctionnalités spécifiques à Lollipop.

Jetez un coup d'œil à http://developer.Android.com/design/style/iconography.html , et vous verrez que le style blanc correspond à la manière dont les notifications doivent être affichées dans Android Lollipop.

Dans Lollipop, Google vous suggère également d'utiliser une couleur qui apparaît derrière l'icône de notification (blanche) - https://developer.Android.com/about/versions/Android-5.0-changes.html

Donc, je pense qu'une meilleure solution consiste à ajouter une icône de silhouette à l'application et à l'utiliser si l'appareil utilise Android Lollipop.

Par exemple:

Notification notification = new Notification.Builder(context)
            .setAutoCancel(true)
            .setContentTitle("My notification")
            .setContentText("Look, white in Lollipop, else color!")
            .setSmallIcon(getNotificationIcon())
            .build();

    return notification;

Et, dans la méthode getNotificationIcon:

private int getNotificationIcon() {
    boolean useWhiteIcon = (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.Lollipop);
    return useWhiteIcon ? R.drawable.icon_silhouette : R.drawable.ic_launcher;
}
266
Daniel Saidi

C'est le code qu'Android utilise pour afficher les icônes de notification: 

// Android_frameworks_base/packages/SystemUI/src/com/Android/systemui/
//   statusbar/BaseStatusBar.Java

if (entry.targetSdk >= Build.VERSION_CODES.Lollipop) {
    entry.icon.setColorFilter(mContext.getResources().getColor(Android.R.color.white));
} else {
    entry.icon.setColorFilter(null);
}

Donc, vous devez définir la version sdk cible sur quelque chose <21 et les icônes resteront colorées. Cette solution de contournement est laide mais elle fait ce qu’elle est censée faire. Quoi qu'il en soit, je suggère vraiment de suivre les directives de Google Règles de conception : _ ​​"Les icônes de notification doivent être entièrement blanches."

Voici comment vous pouvez le mettre en œuvre:

Si vous utilisez Gradle/Android Studio pour créer vos applications, utilisez build.gradle:

defaultConfig {
    targetSdkVersion 20
}

Sinon (Eclipse, etc.), utilisez AndroidManifest.xml:

<uses-sdk Android:minSdkVersion="..." Android:targetSdkVersion="20" />
47
ByteHamster

Pour éviter que les icônes de notification ne deviennent blanches, utilisez les icônes "Silhouette", c.-à-d. images de fond blanches sur transparentes . Vous pouvez utiliser Irfanview pour les construire:

  • choisissez une image, ouvrez-la dans IrfanView, appuyez sur F12 pour les outils de peinture, nettoyez l'image si nécessaire (enlevez les parties non désirées, lissez et polissez)
  • Image / Decrease Color Depth à 2 (pour une photo en noir et blanc)
  • Image / Negative (pour une photo blanche sur noire)
  • Image / Resize/Resample à 144 x 144 (utilisez la méthode de redimensionnement "Redimensionner" et non pas "Rééchantillonnage", sinon l'image passe de nouveau à 24 bits de couleur par pixel (24 BPP)
  • File / Save as PNG, cochez Show option dialog, cochez Save Transparent Color, cliquez sur Save, puis cliquez sur la couleur noire dans l'image pour définir la couleur transparente

Android ne semble utiliser que la résolution d'image drawable-xxhdpi (144 x 144), copiez donc le fichier ic_notification.png obtenu dans \AndroidStudio\Projects\...\app\src\main\res\drawable-xxhdpi. Utilisez .setSmallIcon(R.drawable.ic_notification) dans votre code ou utilisez getNotificationIcon() comme Daniel Saidi l’a suggéré plus haut.

Vous pouvez également utiliser Android Asset Studio de Roman Nurik .

23
Thomas H. Schmidt

Une autre option consiste à tirer parti des répertoires dessinables (mipmap) spécifiques à la version pour fournir différents graphiques pour Lollipop et les versions ultérieures. 

Dans mon application, les répertoires "v21" contiennent des icônes avec du texte transparent, tandis que les autres répertoires contiennent une version non transparente (pour les versions d'Android antérieures à Lollipop).

 File system

Ce qui devrait ressembler à ceci:

 Android Studio

Ainsi, vous n'avez pas besoin de vérifier les numéros de version dans le code, par exemple.

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
        .setSmallIcon(R.mipmap.ic_notification)
        .setContentTitle(title)
        .setContentText(message)
        .setAutoCancel(true)
        .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);

De même, vous pouvez référencer "ic_notification" (ou ce que vous choisissez de l'appeler) dans votre charge utile GCM si vous utilisez l'attribut "icon".

https://developers.google.com/cloud-messaging/http-server-ref#notification-payload-support

14
Ian

Selon les directives de conception d'Android, vous devez utiliser une silhouette pour builder.setSmallIcon(R.drawable.some_notification_icon);. Mais si vous souhaitez tout de même afficher une icône colorée en tant qu'icône de notification, voici l'astuce pour Lollipop et son utilisation ultérieure ci-dessous. LargeIcon agira comme une icône de notification principale et vous devrez également fournir une silhouette pour smallIcon, car elle sera affichée en bas à droite de largeIcon.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop)
{
     builder.setColor(context.getResources().getColor(R.color.red));
     builder.setSmallIcon(R.drawable.some_notification_icon);
     builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher));
}

Et avant Lollipop, utilisez uniquement .setSmallIcon(R.mipmap.ic_launcher) avec votre constructeur.

12
Muhammad Babar

Maintenant, Android studio fournit un plugin Image Asset, qui sera généré par l'icône dans tous les dossiers drawbale requis. 

Image Asset Studio vous aide à créer différents types d’icônes à différentes densités et vous indique exactement où elles seront placées dans votre projet. Il comprend des outils permettant d’ajuster vos icônes et d’ajouter des arrière-plans, tout en affichant le résultat dans un volet de visualisation, afin qu’ils apparaissent exactement comme vous le souhaitez. Ces outils peuvent rationaliser considérablement le processus de conception et d'importation d'icônes.

Vous pouvez accéder à Image Asset en cliquant sur nouveau> cliquez sur l’option Image Asset et la fenêtre suivante s’affiche: - 

 enter image description here

 enter image description here

10
NishchalAndroid

Je faisais face au même problème et c’est parce que mon icône de notification d’application n’était pas plate. Pour la version Android de Lollipop ou même au-dessous de Lollipop, votre icône de notification d'application doit être plate, n'utilisez pas l'icône avec les ombres, etc.

Vous trouverez ci-dessous le code qui a parfaitement fonctionné sur toutes les versions d’Android.

private void sendNotification(String msg) {

    NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

    Intent intent = new Intent(this, CheckOutActivity.class);

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
            this).setSmallIcon(R.drawable.ic_notification)
            .setContentTitle(getString(R.string.app_name))
            .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
            .setContentText(msg).setLights(Color.GREEN, 300, 300)
            .setVibrate(new long[] { 100, 250 })
            .setDefaults(Notification.DEFAULT_SOUND).setAutoCancel(true);

    mBuilder.setContentIntent(contentIntent);
    mNotificationManager.notify(new Random().nextInt(), mBuilder.build());
}

Mauvaise icône
enter image description here

Icône de droite

enter image description here

8
Nauman Zubair

alpha-channel est la seule donnée de l'image utilisée par Android pour les icônes de notification:

  • alpha == 1: pixels affichés en blanc
  • alpha == 0: les pixels sont affichés en tant que couleur choisie à Notification.Builder#setColor(int)

Ceci est mentionné à https://developer.Android.com/about/versions/Android-5.0-changes.html :

Le système ignore tous les canaux non alpha dans les icônes d'action et dans l'icône de notification principale. Vous devez supposer que ces icônes seront uniquement alpha.

Presque tous les tirables intégrés semblent être des images alpha appropriées pour cela, vous pouvez donc utiliser quelque chose comme:

Notification.Builder.setColor(Color.RED)
                    .setSmallIcon(Android.R.drawable.star_on)

mais je cherche toujours le API doc qui le confirme officiellement.

Testé sur Android 22.

Les notifications sont 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 déjà vu des icônes avec plusieurs nuances, comme des barres de force du réseau.

Avant API 21 (Lollipop 5.0), les icônes de couleur fonctionnaient. Vous pouvez forcer votre application à cibler l'API 20, mais cela limite les fonctionnalités disponibles pour votre application et n'est donc pas recommandé. Vous pouvez tester le niveau de l'API en cours d'exécution et définir une icône de couleur ou une icône de niveaux de gris de manière appropriée, mais cela n'en 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 et indiquent la couleur d'arrière-plan.
  • Alpha = 255 (opaque) - Ces pixels sont blancs.
  • Alpha = 1 ... 254 - Ces pixels sont exactement ce que 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'accent (un entier ARVB comme les constantes de Couleur) à appliquer par les modèles de style standard lors de la présentation de cette notification. La conception de modèle actuelle construit une image d'en-tête colorée en superposant l'image d'icône (au pochoir en blanc) au-dessus d'un champ de cette couleur. Les composants alpha sont ignorés.

    Mes tests avec setColor montrent que les composants Alpha sont non ignorés; au lieu de cela, ils fournissent toujours des niveaux de gris. Des valeurs alpha plus élevées deviennent 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 fonction de la couleur spécifiée dans la notification déroulante. (Il semblerait que d'autres personnes aient signalé un comportement légèrement différent, alors soyez-en conscient!)

3
Jeremy Frank

supprimez le Android:targetSdkVersion="21" du fichier manifest.xml. cela fonctionnera! et à partir de là, il n'y a aucun problème dans votre apk c'est juste un truc j'applique cela et j'ai trouvé une icône colorée dans la notification

3
Bhanu Sharma

Publication de Lollipop pour Android Android a modifié les directives pour l'affichage des icônes de notification dans la barre de notification . La documentation officielle indique "Mettez à jour ou supprimez les éléments impliquant la couleur. Le système ignore tous les canaux non alpha dans les icônes d'action et dans la notification principale. icône. Vous devez supposer que ces icônes seront uniquement alpha. Le système affiche les icônes de notification en blanc et les icônes d'action en gris foncé. " Désormais, cela signifie en termes simples que" Convertit toutes les parties de l'image que vous ne veulent pas montrer aux pixels transparents. Toutes les couleurs et les pixels non transparents sont affichés en blanc "

Vous pouvez voir comment faire cela en détail avec des captures d'écran ici https://blog.clevertap.com/fixing-notification-icon-for-Android-Lollipop-and-above/

J'espère que cela pourra aider

2
Rohit Khanna

Vous devez importer l’image PNG transparente à une couleur. Ainsi, vous pouvez définir la couleur de l'icône de la petite icône. Sinon, certains appareils comme MOTO afficheront du blanc.

2
abhi.nalwade

Si vous utilisez GoogleFireBaseMessaging, vous pouvez définir "id d'icône" dans la charge "de notification" (cela m'aide à résoudre le problème de l'icône de barre blanche):

{
    "to":"<fb_id>",
    "priority" : "high",
    "notification" : 
    {
        "title" : "title",
        "body" : "body" ,
        "sound" : "default",
        "icon" : "ic_notification"
    }
}

set ic_notification avec votre propre identifiant de R.drawable.

1
Maxim Firsoff

FYI: Si l’icône ne s’affiche pas, assurez-vous que votre configuration de notification locale ou à distance contient le nom d’icône correct, i.e 

'largeIcon' => 'ic_launcher',
'smallIcon' => 'ic_launcher' // defaults to ic_launcher, 
0
phil

J'ai également rencontré trop de problèmes à ce sujet, mais après une recherche sur Internet, j'ai trouvé différentes solutions à ce problème. Laissez-moi résumer toutes les solutions et expliquer:

Remarque: cette solution est destinée aux utilisateurs de Phonegap Cordova.

  1. Exemple

<preference name="Android-targetSdkVersion" value="20"/>

Vous devez définir la valeur de votre Android-targetSdkVersion sur moins de 21 . Ainsi, après avoir défini cette valeur, l'icône de l'icône de notification apparaîtra jusqu'à Android 6 (Marshmallow), cela ne fonctionnera pas sous Android 7 (Nougat) . Cette solution a fonctionné pour moi.

  1. Changez le statusbarStyle dans votre fichier de configuration . Exemple

<preference name="StatusBarStyle" value="lightcontent" />

Mais cette solution ne fonctionnera que lorsque votre application sera ouverte… Donc, je suppose que cette solution n'est pas la meilleure solution mais qu'elle a fonctionné pour de nombreux utilisateurs.

  1. Rendez votre icône transparente… .. Cette solution a fonctionné pour de nombreuses personnes… .. En fait, le problème est que, dans le développement d'une application native, nous devons leur fournir trois images: (A) Icône de l'application (B ) Icône de notification (C) Image de l’icône de la barre d’état, mais en cas de développement d’une application mobile hybride, il n’est pas possible de le faire . Faites donc en sorte que votre icône soit transparente et que cette solution résout votre problème.

Et je suis sûr que l'une des solutions ci-dessus fonctionnera pour votre problème.

0
Rinku kumar

Selon la documentation, l'icône de notification doit être blanche depuis Android 3.0 (API niveau 11)}:

https://developer.Android.com/guide/practices/ui_guidelines/icon_design_status_bar

"Les icônes de la barre d'état sont composées simplement de pixels blancs sur un fond transparent, la fusion alpha étant utilisée pour les bords lisses et la texture interne, le cas échéant."

0
Laurent

Je pense qu'il est trop tard pour parler de l'API 21, mais j'ai trouvé un moyen simple.

Lors de l'utilisation de 'Notification personnalisée (mise en page personnalisée)',

RemoteView

setImageViewResource(int viewId, int srcId);

et

setImageViewUri(int viewId, Uri uri); 

rend ces images blanches sur Lollipop (API 21).

Mais lors de l'utilisation

setImageViewBitmap(int viewId, Bitmap bitmap);

L'image ne devient pas masquée en blanc!

0
Cake Lime