Mon application génère une notification, mais l'icône que j'ai définie pour cette notification n'est pas affichée. Au lieu de cela, je reçois 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 cherché ce problème dans 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és et que je n'ai pas pour le moment)
Le code pour les notifications suit, et deux captures d'écran. Si vous souhaitez 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);
}
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 sera pas cibler Android Lollipop, ce qui signifie que nous ne pouvons pas utiliser Caractéristiques spécifiques à Lollipop.
Solution pour 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 les versions ultérieures. Veuillez vous reporter aux informations suivantes: https://design.google.com/icons/
Veuillez regarder http://developer.Android.com/design/style/iconography.html , et nous verrons que le style blanc correspond à 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. Voir lien: https://developer.Android.com/about/versions/Android-5.0-changes.html
Où que vous souhaitiez 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 les versions inférieure et supérieure de Lollipop OS 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 est uniquement disponible dans Lollipop et ne concerne que l'arrière-plan de l'icône.
Cela résoudra complètement votre problème !!
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. Elle doit également être définie dans les métadonnées du manifeste, comme suit:
<meta-data Android:name="com.google.firebase.messaging.default_notification_icon"
Android:resource="@drawable/ic_notification" />
Les méta-données vont sous la balise application
, pour référence.
qui dit "Les icônes de notification doivent être entièrement blanches."
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.
Nous pouvons faire comme ci-dessous:
Créez un nouvel objet de générateur de notification et appelez setSmallIcon()
à l'aide de l'objet de générateur de notification, comme indiqué dans le code ci-dessous.
Créez une méthode dans laquelle nous vérifierons la version du système d'exploitation sur laquelle nous installons notre application. S'il se trouve en dessous de Lolipop i.e API 21, l'icône d'application normale avec la couleur d'arrière-plan sera utilisée, sinon l'icône d'application transparente sera affichée sans arrière-plan. Ainsi, les périphériques utilisant os version> = 21 définiront la couleur d'arrière-plan de l'icône à l'aide de la méthode setColor()
de la classe de générateur 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;
}
Enfin, j'ai la solution à ce problème.
Ce problème ne se produit que lorsque l'application n'est pas du tout en cours d'exécution. (ni au fond ni au premier plan). Lorsque l'application app s'exécute au premier plan ou à l'arrière-plan, l'icône de notification s'affiche correctement (pas le carré blanc).
Nous devons donc définir la même configuration pour l'icône de notification dans les API Backend que celle de Frontend.
Dans l'interface utilisateur, nous avons utilisé React Native et pour la notification Push, nous avons utilisé le paquet 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
});
});
Nous avons utilisé fcm-Push npm package 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 fondamentalement pour l’image notification_icon stockée localement dans notre système Android.
Si vous souhaitez fournir une icône de notification de support Lollipop, créez deux icônes de notification de type:
Définissez maintenant l'icône appropriée sur le générateur de notifications 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);
}
<meta-data Android:name="com.google.firebase.messaging.default_notification_icon"
Android:resource="@drawable/ic_notification" />
ajouter cette ligne dans le fichier manifest.xml dans le bloc d'application
j'étais confronté au même problème. J'ai essayé beaucoup de réponses mais je n'ai trouvé aucune solution. J'ai finalement trouvé le moyen de résoudre mon problème.
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());
<meta-data
Android:name="com.google.firebase.messaging.default_notification_icon"
Android:resource="@drawable/app_icon" />
Conditions requises pour résoudre ce problème:
Format d'image: PNG 32 bits (avec alpha)
L'image doit être transparente
Indice de transparence des couleurs: blanc (FFFFFF)
Source: http://gr1350.blogspot.com/2017/01/problem-with-setsmallicon.html
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 l’icône de votre lanceur.
Ouvrez ce Link et téléchargez votre icone ic_launcher
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:
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. 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.
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;
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();
(Android Studio 3.5) Si vous utilisez une version récente de Android Studio, vous pouvez générer vos images de notification. Faites un clic droit sur votre dossier res > Nouveau> Fonds d'image . Vous verrez alors configurer les ressources de l'image comme indiqué dans l'image ci-dessous. Remplacez le type d’icône par par les icônes de notification . Vos images doivent être blanches et transparentes. Ceci Configurez les ressources 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 à utiliser. les icônes de notification nouvellement créées.
<application>
...
<meta-data Android:name="com.google.firebase.messaging.default_notification_icon"
Android:resource="@drawable/ic_notification" />
Lorsque vous souhaitez conserver une icône colorée - Solution de contournement
Ajouter un pixel avec une 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. Lorsque ajouté pixel bleu foncé cela fonctionne.
J'ai le même problème sur Android 8.0. Essayez d'utiliser la ressource icône BLANC. J'ai un carré blanc lorsque j'essaie d'utiliser une image colorée pour l'icône, lorsque je le remplace par une icône blanche, c'est le début.
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" />
où ic_stat_name
créé sur Android Studio, cliquez avec le bouton droit de la souris sur res >> Nouveau >> Fonds de l'image >> IconType (Notification)
Et un pas de plus que je dois faire côté serveur php avec notification charge utile
$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ù nom de l'icône est "icon" => "ic_stat_name"
devrait être identique à celui du manifeste.