android rote - Das Benachrichtigungssymbol wird in Android 5 Lollipop weiß angezeigt




9 Answers

Die angenommene Antwort ist nicht (vollständig) korrekt. Sicher, es macht Benachrichtigungssymbole in Farbe sichtbar, tut dies aber mit einem großen Nachteil - indem Sie das Ziel-SDK niedriger als Android Lollipop setzen!

Wenn Sie das Problem mit dem weißen Symbol lösen, indem Sie das Ziel-SDK wie vorgeschlagen auf 20 setzen, wird Ihre App nicht auf Android Lollipop ausgerichtet. Dies bedeutet, dass Sie keine Lollipop-spezifischen Funktionen verwenden können.

Sehen Sie sich http://developer.android.com/design/style/iconography.html an und Sie werden sehen, dass der weiße Stil ist, wie Benachrichtigungen in Android Lollipop angezeigt werden sollen.

In Lollipop schlägt Google außerdem vor, dass Sie eine Farbe verwenden, die hinter dem (weißen) Benachrichtigungssymbol angezeigt wird: https://developer.android.com/about/versions/android-5.0-changes.html

Daher denke ich, dass es eine bessere Lösung ist, der App ein Silhouettensymbol hinzuzufügen und es zu verwenden, wenn auf dem Gerät Android Lollipop läuft.

Zum Beispiel:

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

    return notification;

Und in der Methode 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;
}
zahl entfernen

Ich habe eine App, die benutzerdefinierte Benachrichtigungen anzeigt. Das Problem ist, dass das kleine Symbol in der Benachrichtigungsleiste in Android 5 in weiß angezeigt wird. Wie kann ich das beheben?




Dies ist der Code, mit dem Android Benachrichtigungssymbole anzeigt:

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

Sie müssen also die Ziel-SDK-Version auf etwas <21 und die Symbole bleiben farbig. Dies ist ein hässlicher Workaround, aber es tut, was es erwartet. Jedenfalls schlage ich vor, den Designrichtlinien von Google zu folgen: "Benachrichtigungssymbole müssen vollständig weiß sein."

Hier ist, wie Sie es implementieren können:

Wenn Sie Gradle / Android Studio zum Erstellen Ihrer Apps verwenden, verwenden Sie build.gradle :

defaultConfig {
    targetSdkVersion 20
}

Andernfalls (Eclipse usw.) verwende AndroidManifest.xml :

<uses-sdk android:minSdkVersion="..." android:targetSdkVersion="20" />



Eine weitere Option ist die Verwendung versionsspezifischer, ausklappbarer (Mipmap-) Verzeichnisse, um verschiedene Grafiken für Lollipop und höher bereitzustellen.

In meiner App enthalten die "v21" -Verzeichnisse Symbole mit transparentem Text, während die anderen Verzeichnisse nicht-transparente Versionen enthalten (für ältere Versionen von Android als Lollipop).

Das sollte in etwa so aussehen:

Auf diese Weise müssen Sie nicht nach Versionsnummern im Code suchen, z

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

Ebenso können Sie in Ihrer GCM-Nutzlast auf "ic_notification" (oder wie auch immer Sie es nennen) verweisen, wenn Sie das Attribut "icon" verwenden.

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




Jetzt Android Studio bietet ein Plugin Image Asset , das Symbol in allen erforderlichen Drawbale-Ordner generieren wird

Image Asset Studio unterstützt Sie beim Erstellen verschiedener Arten von Symbolen mit unterschiedlichen Dichten und zeigt Ihnen genau, wo sie in Ihrem Projekt platziert werden. Sie enthält Werkzeuge zum Anpassen Ihrer Symbole und zum Hinzufügen von Hintergrundbildern. Dabei wird das Ergebnis in einem Vorschaufenster angezeigt, sodass sie genau so angezeigt werden, wie Sie es sich vorgestellt haben. Diese Tools können den Icon-Design- und Importprozess erheblich vereinfachen.

Sie können Image Asset aufrufen, indem Sie auf neu klicken> klicken Sie auf Bild Asset Option und es wird ein Fenster wie folgt angezeigt: -




Alphakanal ist die einzige Daten des Bildes, das Android für Benachrichtigungssymbole verwendet:

  • alpha == 1 : Pixel zeigen weiß
  • alpha == 0 : Pixel werden als die Farbe Notification.Builder#setColor(int) die Sie bei Notification.Builder#setColor(int)

Dies wird unter https://developer.android.com/about/versions/android-5.0-changes.html :

Das System ignoriert alle Nicht-Alpha-Kanäle in Aktionssymbolen und im Hauptbenachrichtigungssymbol. Sie sollten davon ausgehen, dass diese Symbole nur Alpha-Symbole sind.

Fast alle eingebauten Drawables scheinen hierfür geeignete Alpha-Bilder zu sein.

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

aber ich suche immer noch nach dem API-Dokument , das dies offiziell bestätigt.

Getestet auf Android 22.




Benachrichtigungen sind Graustufen wie unten beschrieben. Sie sind nicht schwarz-weiß, trotz allem, was andere geschrieben haben. Sie haben wahrscheinlich Symbole mit mehreren Schattierungen gesehen, z. B. Netzwerkstärkebalken.

Vor API 21 (Lollipop 5.0) funktionieren Farbsymbole. Sie könnten Ihre Anwendung zwingen, auf API 20 zu zielen, aber dies schränkt die für Ihre Anwendung verfügbaren Funktionen ein, daher wird dies nicht empfohlen. Sie könnten die laufende API-Ebene testen und entweder ein Farbsymbol oder ein Graustufen-Symbol entsprechend festlegen, aber das ist wahrscheinlich nicht sinnvoll. In den meisten Fällen empfiehlt es sich, mit einem Graustufen-Symbol zu arbeiten.

Bilder haben vier Kanäle, RGBA (rot / grün / blau / alpha). Bei Benachrichtigungssymbolen ignoriert Android die R-, G- und B-Kanäle. Der einzige Kanal, der zählt, ist Alpha, auch bekannt als Deckkraft. Gestalten Sie Ihr Icon mit einem Editor, der Ihnen die Kontrolle über den Alpha-Wert Ihrer Zeichnungsfarben gibt.

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 NotificationCompat.Builder.setColor(int argb) . Aus der Dokumentation für Notification.color :

    Akzentfarbe (eine ARGB-Ganzzahl wie die Konstanten in Farbe), die von den Standard-Style-Vorlagen angewendet werden soll, wenn diese Benachrichtigung angezeigt wird. Das aktuelle Template-Design erstellt ein buntes Header-Bild, indem es das Icon-Bild (in weiß gestochen) über ein Feld dieser Farbe legt. Alpha-Komponenten werden ignoriert.

    Mein Test mit setColor zeigt, dass Alpha-Komponenten nicht ignoriert werden; stattdessen liefern sie immer noch Graustufen. Höhere Alpha-Werte machen ein Pixel weiß. Niedrigere Alpha-Werte drehen ein Pixel zur Hintergrundfarbe (schwarz auf meinem Gerät) im Infobereich oder zu der angegebenen Farbe in der Pulldown-Benachrichtigung. (Es scheint, dass andere etwas anderes Verhalten gemeldet haben, also sei vorsichtig!)




Wenn Sie GoogleFireBaseMessaging verwenden, können Sie in der Nutzlast "Benachrichtigung" eine "Symbol-ID" festlegen (dies hilft mir, das Problem des weißen Balkensymbols zu lösen):

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

Setzen Sie ic_notification auf Ihre eigene ID von R.drawable.




Hinweis: Wenn das Symbol nicht angezeigt wird, vergewissern Sie sich, dass die lokale oder Remote-Benachrichtigungskonfiguration den richtigen Symbolnamen enthält

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



android:targetSdkVersion="20" sollte < 21 .




Related

android notifications android-5.0-lollipop