Android-Push-Benachrichtigungen: Das Symbol wird in der Benachrichtigung nicht angezeigt. Stattdessen wird ein weißes Quadrat angezeigt

176

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 des Symbols zu ändern (Abmessungen 720 x 720, 66 x 66, 44 x 44, 22 x 22). Seltsamerweise ist bei Verwendung kleinerer Dimensionen das weiße Quadrat kleiner.

Ich habe dieses Problem sowie die korrekte Art der Generierung von Benachrichtigungen gegoogelt und nach 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. Das Problem tritt auch bei Emulatoren auf, einem Samsung Galaxy s4 mit Android 5.0.1 und einem Motorola Moto G mit Android 5.0.1 (beide habe ich ausgeliehen und habe sie momentan nicht).

Es folgt der Code für Benachrichtigungen und zwei Screenshots. Wenn Sie weitere Informationen benötigen, können Sie diese gerne anfordern.

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

ohne die Benachrichtigung zu öffnen Benachrichtigungen geöffnet

Blueriver
quelle
4
Mögliches Duplikat des Benachrichtigungsbalkensymbols wird in Android 5 Lollipop
Ciro Santilli 8 冠状 病 六四 事件 8
1
Hier ist eine Arbeit um stackoverflow.com/a/39142981/1939564
Muhammad Babar
hat dieses Problem behoben? Ich stehe immer noch vor dem gleichen Problem. In der oberen Statusleiste wird immer noch der Leerraum für die Benachrichtigung
angezeigt,
Ja, ich habe das Problem behoben, indem ich ein transparentes Symbol erstellt oder SDK Version 20 oder niedriger ausgewählt habe. Wenn dies das Problem für Sie nicht behebt, hat Ihr ähnliches Problem möglicherweise eine andere Ursache. Ich schlage vor, die SDK-Zielversion auf 20 zu setzen und zu überprüfen, ob sich dadurch etwas ändert. Wenn nicht, nicht sicher, ob diese Frage Ihnen helfen kann :(
Blueriver

Antworten:

186

Ursache: Für 5.0 Lollipop "Benachrichtigungssymbole müssen vollständig weiß sein".

Wenn wir das Problem mit weißen Symbolen lösen, indem wir das Ziel-SDK auf 20 setzen, zielt unsere App nicht auf Android Lollipop ab, was bedeutet, dass wir keine Lollipop-spezifischen Funktionen verwenden können.

Lösung für Ziel Sdk 21

Wenn Sie Lollipop-Materialsymbole unterstützen möchten, erstellen Sie transparente Symbole für Lollipop und eine höhere Version. Weitere Informationen finden Sie unter: https://design.google.com/icons/

Bitte schauen Sie unter http://developer.android.com/design/style/iconography.html nach , und wir werden sehen, dass Benachrichtigungen im weißen Stil in Android Lollipop angezeigt werden sollen.

In Lollipop schlägt Google außerdem vor, 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

Wo immer wir Farben hinzufügen möchten https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#setColor(int)

Die Implementierung von Notification Builder für Lollipop OS-Versionen unter und über LOLipop OS 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 Ihr Problem vollständig lösen !!

Garima Mathur
quelle
Wow Danke. Ich dachte, sie sollten ganz weiß sein, da einige Apps, die ich auf meinem Handy habe, Farbsymbole haben. Jetzt sehe ich den Grund. Danke dir!
Blueriver
3
Mit targetSdkVersion 20 haben Sie meinen Tag gerettet! Vielen Dank.
Arshad Ali
11
Es ist eine schlechte Form, die targetSDK-Version nur aus Gründen der Symbole auf <21 zu setzen. Es ist besser, es richtig zu beheben, wie in dieser Antwort beschrieben: stackoverflow.com/questions/27343202/…
user90766
1
aber im Hintergrund, wenn die App nicht im Stapel ist, zeigt sie die weißen Symbole, was zu tun ist, um auf jeden Fall das gleiche Ergebnis zu
erzielen
1
Ich habe alles versucht, aber es funktioniert nicht. es zeigt immer noch einen Punkt mit einer farblichen Erwähnung in der Manifestdatei
Harsh Shah
66

Wenn Sie Google Cloud Messaging verwenden, wird dieses Problem nicht durch einfaches Ändern Ihres Symbols behoben . Dies funktioniert beispielsweise nicht:

 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 wie folgt definiert werden:

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

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

Metadaten werden als applicationReferenz unter das Tag gestellt.

Ruchir Baronia
quelle
6
Vielen Dank für den Hinweis mit den Metadaten im Manifest.
Eugen Timm
Wie platziere ich "@ drawable / ic_notification"? ist es eine Ikone? viele? ist es PNG?
Luke Pighetti
1
@LukePighetti Es können viele sein, wenn Sie Bilder unterschiedlicher Größe für mehrere Bildschirmauflösungen hochladen. Andernfalls kann es sich um eine PNG-Datei in Ihrem Zeichenverzeichnis handeln.
Ruchir Baronia
1
@RuchirBaronia also für das obige Beispiel res/drawable/ic_notification.pngder Größe 196x196?
Luke Pighetti
thx @RuchirBaronia, für den Meta-dataTag-Vorschlag positiv bewertet .
Ravi Vaniya
37

Ich empfehle wirklich, die Designrichtlinien von Google zu befolgen :

Darin heißt es: "Benachrichtigungssymbole müssen vollständig weiß sein."

NJ
quelle
2
Ihre Antwort ist noch besser als die, die ich akzeptiert habe. Ich wünschte, ich könnte auch deine akzeptieren. Ich kann nicht, aber du hast meine +1 und meine Dankbarkeit. Prost!
Blueriver
2
Dies ist keine sehr gute Antwort. Was wäre, wenn die Stakeholder des Projekts auf Android 7 abzielen müssten? Ich kann vorher nicht einfach auf eine SDK-Version abzielen.
Neon Warge
1
Diese Antwort wurde abgelehnt, da sie falsch ist. Der Fragesteller sagt, dass ich meine App nicht auf sdk21 ausführen kann. Antwort sagt "benutze nicht sdk 21"
Utsav Gupta
1
Dies ist wirklich keine Lösung.
Jose Gómez
1
Ich kann in den aktuellen Designrichtlinien nichts finden, das angibt, dass das Symbol auf einem transparenten Hintergrund weiß sein muss. Ungeachtet der schlechten Dokumentation scheint dies immer noch der Fall zu sein.
Imagio
28

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.

Vicky Mahale
quelle
Oh mein! Dieser funktioniert perfekt für FCM-Push-Benachrichtigungen! Vielen Dank
Crono
1
Wo platzierst du ic_stat_name? Ist es ein PNG? sind es viele? bitte helfen!
Luke Pighetti
3
@ Luke Pighetti In Android Studio Rechtsklick auf App >> Neu >> Bild-Assets >> IconType (Benachrichtigung)
Vicky Mahale
1
(Ich weiß, es ist schon eine Weile her, aber) Könnten Sie das bitte erklären? Was soll es tun? Wird das nicht transparente Vollfarbsymbol gerendert oder was?
afe
Dies ist die richtige Antwort für Firebase-Cloud-Messaging-Benachrichtigungen.
Greg Ellis
10

Wir können wie folgt vorgehen:

Erstellen Sie ein neues Objekt des Benachrichtigungserstellers und rufen Sie es auf setSmallIcon() mit dem Benachrichtigungs-Generator-Objekt wie im folgenden Code auf.

Erstellen Sie eine Methode, mit der wir überprüfen, auf welcher Betriebssystemversion wir unsere App installieren. Wenn es sich unter Lolipop befindet, dh API 21, wird das normale App-Symbol mit Hintergrundfarbe verwendet, andernfalls wird das transparente App-Symbol ohne Hintergrund verwendet. Daher stellen die Geräte, die os version> = 21 verwenden, die Hintergrundfarbe des Symbols mithilfe der Methode einsetColor() der Benachrichtigungs-Builder-Klasse fest.

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;
}
Rahul Sharma
quelle
Ich habe setColorauf Kitkat (API 19) und IceCreamSandwich (API 15) getestet. In beiden Fällen wurde die Farbe ignoriert, aber nicht abgestürzt . Kann ich die Überprüfung der Betriebssystemversion sicher unterlassen?
Maria
10
 <meta-data android:name="com.google.firebase.messaging.default_notification_icon"

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

Fügen Sie diese Zeile in die Datei manifest.xml im Anwendungsblock ein

Sajidh Zahir
quelle
9

Versuche dies

Ich hatte das gleiche Problem, ich habe viele Antworten ausprobiert, aber keine Lösungen gefunden. Schließlich habe ich den Weg gefunden, mein Problem zu lösen.

- Benachrichtigungssymbol mit transparentem Hintergrund erstellen. Die Breite und Höhe der App muss den folgenden Größen entsprechen und alle diese in Ihr Projekt-> App-> src-> main-> res einfügen

  • MDPI 24 * 24

  • HDPI 36 * 36

  • XHDPI 48 * 48

  • XXHDPI 72 * 72


Fügen Sie nach dem obigen 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());

Vergessen Sie nicht, diesen Code in die Manifestdatei einzufügen

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

(Android Studio 3.5) Wenn Sie eine aktuelle Version von Android Studio sind, können Sie Ihre Benachrichtigungsbilder generieren. Klicken Sie mit der rechten Maustaste auf Ihren Res-Ordner > Neu> Image Asset . Anschließend wird Configure Image Assets angezeigt ( siehe Abbildung unten). Ändern Sie den Symboltyp in Benachrichtigungssymbole . Ihre Bilder müssen weiß und transparent sein. Diese Option "Image Assets konfigurieren" erzwingt diese Regel. Wichtig: Wenn Sie möchten, dass die Symbole für Cloud- / Push-Benachrichtigungen verwendet werden, müssen Sie die Metadaten unter Ihrem Anwendungs-Tag hinzufügen, um die neu erstellten Benachrichtigungssymbole zu verwenden.Konfigurieren Sie Image Assets

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

Wenn Sie ein Benachrichtigungssymbol für die Lollipop-Unterstützung bereitstellen möchten, erstellen Sie zwei Benachrichtigungssymbole:

  1. normales Benachrichtigungssymbol: für die unten stehende Lollipop-Version.
  2. Benachrichtigungssymbol mit transparentem Hintergrund: für Lollipop und höher.

Setzen Sie nun das entsprechende Symbol zur Laufzeit basierend auf der Betriebssystemversion auf den Benachrichtigungs-Builder:

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
quelle
7

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).

Wir müssen also die gleiche Konfiguration für das Benachrichtigungssymbol in Backend-APIs festlegen wie in Frontend.

Im Frontend haben wir React Native verwendet und für die Push-Benachrichtigung haben wir das Paket react-native-fcm npm 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 das Paket fcm-push npm mit Node.js als Backend für die Push-Benachrichtigung verwendet und die Nutzlaststruktur wie folgt festgelegt.

{
  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 Grunde nach dem Benachrichtigungsbild sucht, das lokal in unserem Android-System gespeichert ist.

Aniruddha Shevle
quelle
1
Ihr Problem unterscheidet sich sehr von meinem, obwohl es den gleichen Effekt hat. Vielen Dank, dass Sie diese Antwort veröffentlicht haben. Sie wird wahrscheinlich jemandem helfen, der denselben Tech-Stack verwendet, den Sie verwenden.
Blueriver
1
@ IanWarburton: Keine Notwendigkeit.
Aniruddha Shevle
5

Benachrichtigungen sind Graustufen, wie unten erläutert. Sie sind nicht schwarz-weiß, trotz dessen, was andere geschrieben haben. Sie haben wahrscheinlich Symbole mit mehreren Schattierungen gesehen, z. B. Balken für die Netzwerkstärke.

Vor API 21 (Lollipop 5.0) funktionieren Farbsymbole. Sie können Ihre Anwendung auf die Ziel-API 20 zwingen, dies schränkt jedoch die für Ihre Anwendung verfügbaren Funktionen ein, sodass dies nicht empfohlen wird. Sie können die laufende API-Ebene testen und entweder ein Farbsymbol oder ein Graustufensymbol entsprechend festlegen. Dies ist jedoch wahrscheinlich nicht sinnvoll. In den meisten Fällen ist es am besten, ein Graustufensymbol 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 als Deckkraft bekannt. Entwerfen Sie Ihr Symbol mit einem Editor, mit dem Sie den Alpha-Wert Ihrer Zeichnungsfarben steuern können.

Wie Alpha-Werte ein Graustufenbild erzeugen:

  • Alpha = 0 (transparent) - Diese Pixel sind transparent und zeigen die Hintergrundfarbe.
  • Alpha = 255 (undurchsichtig) - Diese Pixel sind weiß.
  • Alpha = 1 ... 254 - Diese Pixel sind genau das, was Sie erwarten würden, und bieten die Schattierungen zwischen transparent und weiß.

Ändern mit setColor:

  • Rufen Sie an NotificationCompat.Builder.setColor(int argb). Aus der Dokumentation für Notification.color:

    Akzentfarbe (eine ARGB-Ganzzahl wie die Konstanten in Farbe), die von den Standardstilvorlagen angewendet wird, wenn diese Benachrichtigung angezeigt wird. Das aktuelle Vorlagendesign erstellt ein farbenfrohes Header-Bild, indem das Symbolbild (weiß schabloniert) über ein Feld dieser Farbe gelegt wird. Alpha-Komponenten werden ignoriert.

    Meine Tests mit setColor zeigen, dass Alpha-Komponenten nicht ignoriert werden. Höhere Alpha-Werte färben ein Pixel weiß. Niedrigere Alpha-Werte ändern ein Pixel in die Hintergrundfarbe (auf meinem Gerät schwarz) im Benachrichtigungsbereich oder in die angegebene Farbe in der Pulldown-Benachrichtigung.

Jeremy Frank
quelle
5

Ich habe das Problem gelöst, indem ich den 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_namein Android Studio erstellt Klicken Sie mit der rechten Maustaste auf res >> Neu >> Image Assets >> IconType (Benachrichtigung)

Und noch ein Schritt, den ich auf der Server-PHP-Seite mit Benachrichtigungsnutzdaten 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"
            ]
        ]

Der Name des Symbols "icon" => "ic_stat_name"sollte im Manifest identisch sein.

Haris
quelle
4

Ich habe einen Link gefunden, über den wir unser eigenes weißes Symbol generieren können.

Versuchen Sie diesen Link, um ein weißes Symbol für Ihr Startsymbol zu generieren.

Öffnen Sie diesen Link und laden Sie Ihren ic_launcher oder Ihr Benachrichtigungssymbol hoch

Ghanshyam Nayma
quelle
1

Sie können verschiedene Symbole für verschiedene Versionen verwenden. Stellen Sie einfach die Logik auf Ihr Symbol wie folgt ein:

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
quelle
1

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();
Caat c
quelle
1

Um SDK-spezifische Versionen zu reduzieren, können Sie einfach Folgendes tun: ('#' durch '0x' ersetzen)

Notification notification = new NotificationCompat.Builder(this);
notification.setSmallIcon(R.drawable.icon_transperent);
notification.setColor(0x169AB9); //for color: #169AB9
Dongkichan
quelle
0xFF169AB9fehlt Ihnen der vollständig undurchsichtige Alpha-Kanal.
Eugen Pechanec
0

Wenn Sie ein farbenfrohes Symbol behalten möchten - Problemumgehung
Fügen Sie dem Symbol Pixel mit etwas anderer Farbe hinzu.
In meinem Fall habe ich ein schwarzes Symbol mit Schatten und Licht. Wenn dunkelblaue Pixel hinzugefügt werden, funktioniert es.

Vouskopes
quelle
0

Ich habe ein ähnliches Problem auf Android 8.0. Versuchen Sie, die Ressource WEISSE Symbole zu verwenden. Ich habe ein weißes Quadrat, wenn ich versuche, ein farbiges Bild als Symbol zu verwenden. Wenn ich es durch ein weißes Symbol ersetze, beginnt die Arbeit.

Zeon
quelle