Meine App generiert eine Benachrichtigung, aber das Symbol, das ich für diese Benachrichtigung festgelegt habe, wird nicht angezeigt. Stattdessen bekomme ich ein weißes Quadrat.
Ich habe versucht, die Größe des PNG-Symbols zu ändern (Abmessungen 720x720, 66x66, 44x44, 22x22). Seltsamerweise ist das weiße Quadrat bei kleineren Abmessungen kleiner.
Ich habe dieses Problem gegoogelt sowie die korrekte Art und Weise, Benachrichtigungen zu generieren, und aus dem, was ich gelesen habe, sollte mein Code korrekt sein. Leider sind die Dinge nicht so, wie sie sein sollten.
Mein Handy ist ein Nexus 5 mit Android 5.1.1. Problem gibt es auch bei Emulatoren, einem Samsung Galaxy S4 mit Android 5.0.1 und einem Motorola Moto G mit Android 5.0.1 (beide habe ich mir geliehen und habe sie gerade nicht)
Code für Benachrichtigungen folgt und zwei Screenshots. Wenn Sie weitere Informationen benötigen, können Sie gerne danach fragen.
Danke euch allen.
@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);
}
Ursache: Bei 5.0 Lollipop "Benachrichtigungssymbole müssen vollständig weiß sein".
Wenn wir das Problem mit dem weißen Symbol lösen, indem wir das Ziel-SDK auf 20 setzen, wird unsere App richtet sich nicht an Android Lollipop, was bedeutet, dass wir .__ nicht verwenden können. Lutscher-spezifische Funktionen.
Solution for target Sdk 21
Wenn Sie Lollipop-Materialsymbole unterstützen möchten, erstellen Sie transparente Symbole für Lollipop und die höhere Version. Siehe dazu: https://design.google.com/icons/
Bitte schauen Sie unter http://developer.Android.com/design/style/iconography.html nach, und wir werden sehen, dass der weiße Stil so ist, wie Benachrichtigungen in Android Lollipop angezeigt werden sollen.
In Lollipop empfiehlt Google auch, eine Farbe zu verwenden, die hinter dem weißen Benachrichtigungssymbol angezeigt wird. Siehe Link: https://developer.Android.com/about/versions/Android-5.0-changes.html
Überall, wo wir die Farben hinzufügen möchten https://developer.Android.com/reference/Android/support/v4/app/NotificationCompat.Builder.html#setColor(int)
Die Implementierung des Benachrichtigungs-Generators für die Lollipop-OS-Version wäre:
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);
}
Hinweis: setColor ist nur in Lollipop verfügbar und wirkt sich nur auf den Hintergrund des Symbols aus.
Es wird dein Problem vollständig lösen !!
Wenn Sie Google Cloud Messaging verwenden, wird dieses Problem nicht gelöst , indem Sie einfach Ihr Symbol ändern. Zum Beispiel wird dies nicht funktionieren:
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();
Auch wenn ic_notification transparent und weiß ist. Es muss auch in den Manifest-Metadaten definiert sein:
<meta-data Android:name="com.google.firebase.messaging.default_notification_icon"
Android:resource="@drawable/ic_notification" />
Metadaten werden zur Referenz unter dem Tag application
abgelegt.
das sagt "Benachrichtigungssymbole müssen vollständig weiß sein."
Deklarieren Sie diesen Code in Android Manifest:
<meta-data Android:name="com.google.firebase.messaging.default_notification_icon"
Android:resource="@drawable/ic_stat_name" />
Ich hoffe das ist nützlich für dich.
Wir können wie folgt machen:
Erstellen Sie ein neues Objekt für den Benachrichtigungsgenerator, und rufen Sie setSmallIcon()
mit dem Benachrichtigungsgeneratorobjekt wie im nachstehenden Code auf.
Erstellen Sie eine Methode, mit der wir prüfen, auf welcher Betriebssystemversion wir unsere App installieren. Wenn es sich unterhalb von Lolipop API 21 befindet, wird das normale App-Symbol mit Hintergrundfarbe verwendet. Andernfalls wird das transparente App-Symbol ohne Hintergrund verwendet. Die Geräte, die die OS-Version> = 21 verwenden, setzen die Hintergrundfarbe des Symbols mit der Methode setColor()
der Builder-Klasse Notification.
Beispielcode:
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;
}
Endlich habe ich die Lösung für dieses Problem.
Dieses Problem tritt nur auf, wenn die App überhaupt nicht ausgeführt wird. (weder im Hintergrund noch im Vordergrund). Wenn die app entweder im Vordergrund oder im Hintergrund ausgeführt wird, wird das Benachrichtigungssymbol ordnungsgemäß angezeigt. (Nicht das weiße Quadrat)
Was wir also einstellen müssen, ist die gleiche Konfiguration für das Benachrichtigungssymbol in Backend-APIs wie für Frontend.
Im Frontend haben wir React Native verwendet, und für die Push-Benachrichtigung haben wir reag-native-fcm npm package verwendet.
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
});
});
Wir haben fcm-Push npm package mit Node.js als Backend für Push-Benachrichtigungen verwendet und die Payload-Struktur wie folgt eingestellt.
{
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"
}
}
Was es im Wesentlichen nach dem notification_icon-Bild sucht, das lokal in unserem Android-System gespeichert ist.
Wenn Sie ein Lollipop-Support-Benachrichtigungssymbol bereitstellen möchten, erstellen Sie zwei Benachrichtigungssymbole:
Setzen Sie jetzt das entsprechende Symbol für den Benachrichtigungsgenerator zur Laufzeitbasis unter der Betriebssystemversion:
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" />
fügen Sie diese Zeile in der Datei manifest.xml im Anwendungsblock hinzu
ich war mit demselben Problem konfrontiert. Ich habe viele Antworten ausprobiert, aber keine Lösungen gefunden. Schließlich fand ich den Weg, mein Problem zu lösen.
MDPI 24 * 24
HDPI 36 * 36
XHDPI 48 * 48
XXHDPI 72 * 72
fügen Sie anschließend die folgende Zeile in Ihre onMessageReceived-Methode ein
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" />
Voraussetzungen zur Behebung dieses Problems:
Bildformat: 32-Bit-PNG (mit Alpha)
Bild sollte transparent sein
Transparenzfarbindex: Weiß (FFFFFF)
Quelle: http://gr1350.blogspot.com/2017/01/problem-with-setsmallicon.html
Ich habe einen Link gefunden, wo wir unser eigenes weißes Symbol erzeugen können.
versuchen Sie diesen Link, um ein weißes Symbol Ihres Startprogramms zu generieren.
Öffne diesen Link und lade dein ic_launcher oder Benachrichtigungssymbol hoch
Benachrichtigungen sind Graustufen wie unten erklärt. Sie sind nicht schwarzweiß, auch wenn andere geschrieben haben. Sie haben wahrscheinlich Symbole mit mehreren Schattierungen gesehen, z.
Vor API 21 (Lollipop 5.0) funktionieren Farbsymbole. Sie können Ihre Anwendung zwingen, die API 20 als Ziel festzulegen, dies beschränkt jedoch die für Ihre Anwendung verfügbaren Funktionen. Daher wird dies nicht empfohlen. Sie können die laufende API-Ebene testen und entweder ein Farbsymbol oder ein Graustufen-Symbol festlegen, was sich jedoch nicht lohnt. In den meisten Fällen ist es am besten, ein Graustufen-Symbol zu verwenden.
Bilder haben vier Kanäle, RGBA (rot/grün/blau/alpha). Bei Benachrichtigungssymbolen ignoriert Android die Kanäle R, G und B. Der einzige Kanal, der zählt, ist Alpha, auch Opazität genannt. Entwerfen Sie Ihr Symbol mit einem Editor, mit dem Sie den Alpha-Wert Ihrer Zeichnungsfarben steuern können.
Wie Alpha-Werte ein Graustufenbild erzeugen:
Ändern Sie es mit setColor
:
Rufen Sie NotificationCompat.Builder.setColor(int argb)
auf. Aus der Dokumentation für Notification.color
:
Akzentfarbe (eine ARGB-Ganzzahl wie die Konstanten in Color), die von den Standardstilvorlagen angewendet wird, wenn diese Benachrichtigung angezeigt wird. Das aktuelle Schablonendesign erstellt ein farbenfrohes Kopfbild, indem das Symbolbild (weiß dargestellt) auf einem Feld dieser Farbe überlagert wird. Alpha-Komponenten werden ignoriert.
Mein Test mit setColor zeigt, dass Alpha-Komponenten nicht ignoriert werden. Bei höheren Alpha-Werten wird ein Pixel weiß. Bei niedrigeren Alpha-Werten wird ein Pixel in der Hintergrundfarbe (auf meinem Gerät schwarz) im Infobereich oder in der Pulldown-Benachrichtigung in der angegebenen Farbe angezeigt.
Sie können verschiedene Symbole für verschiedene Versionen verwenden. Legen Sie einfach die Logik für Ihr Symbol so fest:
int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop ? R.drawable.colored_: R.drawable.white_tint_icon_for_lolipop_or_upper;
Für SDK> = 23 fügen Sie bitte setLargeIcon hinzu
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) Wenn Sie eine aktuelle Version von Android Studio verwenden, können Sie Ihre Benachrichtigungsbilder generieren. Klicken Sie mit der rechten Maustaste auf Ihren Res-Ordner > Neu> Bild-Asset . Daraufhin wird Configure Image Assets angezeigt (siehe Abbildung unten). Ändern Sie Symboltyp in Benachrichtigungssymbole . Ihre Bilder müssen weiß und transparent sein. Mit dieser Option Image-Assets konfigurieren wird diese Regel erzwungen. Wichtig: Wenn Sie möchten, dass die Symbole für Cloud-/Push-Benachrichtigungen verwendet werden, müssen Sie die Metadaten unter Ihrem Anwendungstag hinzufügen, um sie zu verwenden die neu erstellten Benachrichtigungssymbole.
<application>
...
<meta-data Android:name="com.google.firebase.messaging.default_notification_icon"
Android:resource="@drawable/ic_notification" />
Wenn Sie das farbige Symbol beibehalten möchten - Problemumgehung
Fügen Sie dem Symbol etwas andere Farbe hinzu.
In meinem Fall habe ich ein schwarzes Symbol mit Schatten und Licht. Wenn ein dunkelblaues Pixel hinzugefügt wird, funktioniert es.
Ich habe ein ähnliches Problem auf Android 8.0. Versuchen Sie, die WHITE-Symbolressource zu verwenden. Ich habe ein weißes Quadrat, wenn ich versuche, ein farbiges Bild für ein Symbol zu verwenden, wenn ich es durch ein weißes Symbol ersetze.
Ich habe das Problem behoben, indem ich folgenden Code zum Manifest hinzugefügt habe:
<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" />
wo ic_stat_name
erstellt in Android Studio Rechtsklick auf res >> Neu >> Bild Assets >> IconType (Benachrichtigung)
Und noch ein Schritt, den ich auf der Server-PHP-Seite mit Benachrichtigungs-Payload machen muss
$message = [
"message" => [
"notification" => [
"body" => $title ,
"title" => $message
],
"token" => $token,
"Android" => [
"notification" => [
"sound" => "default",
"icon" => "ic_stat_name"
]
],
"data" => [
"title" => $title,
"message" => $message
]
]
];
Beachten Sie den Abschnitt
"Android" => [
"notification" => [
"sound" => "default",
"icon" => "ic_stat_name"
]
]
wobei der Symbolname "icon" => "ic_stat_name"
ist, sollte derselbe Satz im Manifest sein.