it-swarm.com.de

Android Push-Benachrichtigungen: Symbol wird nicht in der Benachrichtigung angezeigt, stattdessen wird ein weißes Quadrat angezeigt

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

without opening the notificationnotifications opened

123
Blueriver

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

146
Garima Mathur

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.

32
Ruchir Baronia

Ich schlage wirklich Folgendes vor: Die Gestaltungsrichtlinien von Google :

das sagt "Benachrichtigungssymbole müssen vollständig weiß sein."

19
N J

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.

15
vicky mahale

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;
}
10
rahul sharma

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.

7

Wenn Sie ein Lollipop-Support-Benachrichtigungssymbol bereitstellen möchten, erstellen Sie zwei Benachrichtigungssymbole:

  1. normales Benachrichtigungssymbol: für die Lollipop-Version. 
  2. benachrichtigungssymbol mit transparentem Hintergrund: für Lollipop und vorige Version.

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

6
Sajidh Zahir

Versuche dies

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.

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

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

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" />
5
Sunil

Voraussetzungen zur Behebung dieses Problems:

  1. Bildformat: 32-Bit-PNG (mit Alpha)

  2. Bild sollte transparent sein

  3. Transparenzfarbindex: Weiß (FFFFFF)

Quelle: http://gr1350.blogspot.com/2017/01/problem-with-setsmallicon.html

3
user7478049

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

3
Ghanshyam Nayma

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:

  • 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. Sie liefern die Farbtöne zwischen transparent und weiß.

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

3
Jeremy Frank

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;
1
Md. Al- Rasel

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

(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. Configure Image Assets 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" />
1
olearyj234

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. 

0
Vouskopes

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.

0
Zeon

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.

0
Haris