it-swarm.com.de

Das Benachrichtigungsbalkensymbol wird in Android 5 Lollipop weiß

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

201

Die akzeptierte Antwort ist nicht (vollständig) korrekt. Sicher, die Benachrichtigungssymbole werden farbig dargestellt, haben jedoch einen großen Nachteil - indem das Ziel-SDK auf einen niedrigeren Wert als der Android-Lollipop gesetzt wird!

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

Werfen Sie einen Blick auf http://developer.Android.com/design/style/iconography.html . Sie werden sehen, dass der weiße Stil so ist, wie Benachrichtigungen in Android Lollipop angezeigt werden sollen.

In Lollipop empfiehlt Google außerdem, eine Farbe zu verwenden, die hinter dem (weißen) Benachrichtigungssymbol angezeigt wird - https://developer.Android.com/about/versions/Android-5.0-changes.html .

Ich denke, es ist eine bessere Lösung, der App ein Silhouette-Symbol hinzuzufügen und es zu verwenden, wenn auf dem Gerät Android Lollipop ausgeführt wird.

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 getNotificationIcon-Methode:

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;
}
266
Daniel Saidi

Stimme voll und ganz dem Benutzer Daniel Saidi zu. Um Color für NotificationIcon zu haben, schreibe ich diese Antwort.

Dazu müssen Sie ein Symbol wie Silhouette erstellen und einen Abschnitt Transparent erstellen, wo immer Sie Ihr Colors hinzufügen möchten. d.h.

enter image description here

Sie können Ihre Farbe mit hinzufügen

.setColor(your_color_resource_here)

HINWEIS: setColor ist nur in Lollipop verfügbar. Sie müssen also OSVersion aktivieren.

if (Android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.Lollipop) {
    Notification notification = new Notification.Builder(context)
    ...
} else {
    // Lollipop specific setColor method goes here.
    Notification notification = new Notification.Builder(context)
    ...
    notification.setColor(your_color)
    ...            
}

Sie können dies auch erreichen, indem Sie Lollipop als Ziel SDK verwenden.

Alle Anweisungen zu NotificationIcon finden Sie unter Benachrichtigungsrichtlinien für Google Developer Console .

Bevorzugte Benachrichtigungssymbolgröße 24x24dp

mdpi    @ 24.00dp   = 24.00px
hdpi    @ 24.00dp   = 36.00px
xhdpi   @ 24.00dp   = 48.00px

Und beziehen Sie sich auch auf diesen Link für Größen der Benachrichtigungssymbole für weitere Informationen.

71
Jaydipsinh Zala

Dies ist der Code, der Android verwendet, um Benachrichtigungssymbole anzuzeigen:

// 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 setzen <21 und die Symbole bleiben farbig. Dies ist eine hässliche Problemumgehung, die jedoch das tut, was von ihr erwartet wird. Wie auch immer, ich empfehle wirklich, die Gestaltungsrichtlinien von Google zu befolgen: "Benachrichtigungssymbole müssen vollständig sein weiß. "

So können Sie es implementieren:

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

defaultConfig {
    targetSdkVersion 20
}

Ansonsten (Eclipse etc) benutze AndroidManifest.xml:

<uses-sdk Android:minSdkVersion="..." Android:targetSdkVersion="20" />
47
ByteHamster

Um zu verhindern, dass Benachrichtigungssymbole weiß werden, verwenden Sie die Symbole "Silhouette", z. Weiß-auf-transparente Hintergrundbilder .. Sie können Irfanview verwenden, um sie zu erstellen:

  • wählen Sie ein Bild aus, öffnen Sie es in IrfanView, drücken Sie F12 für die Malwerkzeuge, und reinigen Sie das Bild ggf. (entfernen Sie unerwünschte Teile, glätten und polieren).
  • Image / Decrease Color Depth bis 2 (für ein Schwarzweißbild)
  • Image / Negative (für ein Weiß auf schwarzem Bild)
  • Image / Resize/Resample auf 144 x 144 (verwenden Sie die Größenmethode "Größe ändern" nicht "Resample"), andernfalls wird das Bild erneut auf 24 Farbbits pro Pixel (24 BPP) erhöht
  • File / Save as PNG, überprüfen Sie Show option dialog, überprüfen Sie Save Transparent Color, klicken Sie auf Save, und klicken Sie dann auf die schwarze Farbe im Bild, um die transparente Farbe festzulegen

Android scheint nur die drawable-xxhdpi-Bildauflösung (144 x 144) zu verwenden. Kopieren Sie daher die resultierende ic_notification.png-Datei in \AndroidStudio\Projects\...\app\src\main\res\drawable-xxhdpi. Verwenden Sie .setSmallIcon(R.drawable.ic_notification) in Ihrem Code oder verwenden Sie getNotificationIcon() wie von Daniel Saidi vorgeschlagen.

Sie können auch Roman Nuriks Android Asset Studio verwenden.

23

Eine weitere Option ist die Verwendung von versionsspezifischen Drawable-Verzeichnissen (Mipmap), um unterschiedliche Grafiken für Lollipop und höher bereitzustellen. 

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

 File system

Was sollte ungefähr so ​​aussehen:

 Android Studio

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 möchten) verweisen, wenn Sie das Attribut "icon" verwenden.

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

14
Ian

Gemäß den Android-Designrichtlinien müssen Sie eine Silhouette für builder.setSmallIcon(R.drawable.some_notification_icon); verwenden. Wenn Sie jedoch weiterhin ein buntes Symbol als Benachrichtigungssymbol anzeigen möchten, ist der Trick für Lollipop und der folgende Code. Das largeIcon wird als primäres Benachrichtigungssymbol fungieren. Sie müssen außerdem eine Silhouette für smallIcon bereitstellen, da diese über dem rechten unteren Rand des largeIcon angezeigt wird.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop)
{
     builder.setColor(context.getResources().getColor(R.color.red));
     builder.setSmallIcon(R.drawable.some_notification_icon);
     builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher));
}

Und vor Lollipop verwenden Sie nur .setSmallIcon(R.mipmap.ic_launcher) mit Ihrem Builder.

12
Muhammad Babar

Jetzt bietet Android Studio ein Plugin Image Asset an, das ein Symbol in allen erforderlichen Drawbale-Ordnern generiert 

Image Asset Studio hilft Ihnen bei der Erstellung verschiedener Symboltypen mit unterschiedlichen Dichten und zeigt Ihnen genau an, wo sie in Ihrem Projekt platziert werden. Es enthält Werkzeuge zum Anpassen der Symbole und zum Hinzufügen von Hintergründen, während das Ergebnis in einem Vorschaubereich angezeigt wird, sodass sie genau wie beabsichtigt angezeigt werden. Diese Tools können die Gestaltung und den Import von Symbolen erheblich vereinfachen.

Sie können auf Image Asset zugreifen, indem Sie auf neu klicken.> Klicken Sie auf die Option Image Asset. Das folgende Fenster wird angezeigt: - 

 enter image description here

 enter image description here

10
NishchalAndroid

Ich war mit demselben Problem konfrontiert und es war aufgrund meines App-Benachrichtigungssymbols nicht flach. Bei der Android-Version Lollipop oder sogar unterhalb von Lollipop sollte das Benachrichtigungssymbol der App leer sein. Verwenden Sie kein Symbol mit Schatten usw.

Unten ist der Code, der auf allen Android-Versionen einwandfrei funktioniert.

private void sendNotification(String msg) {

    NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

    Intent intent = new Intent(this, CheckOutActivity.class);

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
            this).setSmallIcon(R.drawable.ic_notification)
            .setContentTitle(getString(R.string.app_name))
            .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
            .setContentText(msg).setLights(Color.GREEN, 300, 300)
            .setVibrate(new long[] { 100, 250 })
            .setDefaults(Notification.DEFAULT_SOUND).setAutoCancel(true);

    mBuilder.setContentIntent(contentIntent);
    mNotificationManager.notify(new Random().nextInt(), mBuilder.build());
}

Falsches Symbol
enter image description here

Rechtes Symbol

enter image description here

8
Nauman Zubair

alpha-channel sind die einzigen Daten des Bildes, die Android für Benachrichtigungssymbole verwendet:

  • alpha == 1: Pixel zeigen weiß
  • alpha == 0: Pixel werden als die Farbe angezeigt, die Sie unter Notification.Builder#setColor(int) ausgewählt haben.

Dies wird unter https://developer.Android.com/about/versions/Android-5.0-changes.html erwähnt:

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

Fast alle eingebaute Drawables scheinen dafür Alpha-Bilder zu sein, daher könnten Sie etwa Folgendes verwenden:

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

aber ich suche immer noch nach der API doc , die das offiziell bestätigt.

Getestet auf Android 22.

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. Stattdessen liefern sie immer noch Graustufen. 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. (Es scheint, dass andere etwas anderes Verhalten gemeldet haben, seien Sie sich dessen bewusst!)

3
Jeremy Frank

entfernen Sie den Android:targetSdkVersion="21" aus manifest.xml. es wird funktionieren! und davon gibt es in deinem apk überhaupt kein problem

3
Bhanu Sharma

Post-Android-Lollipop-Release veröffentlichen Android hat die Richtlinien für die Anzeige von Benachrichtigungssymbolen in der Benachrichtigungsleiste geändert .. Die offizielle Dokumentation besagt "Aktualisieren oder Entfernen von Elementen, die Farbe enthalten. Das System ignoriert alle Nicht-Alpha-Kanäle in Aktionssymbolen und in der Hauptbenachrichtigung Sie sollten davon ausgehen, dass es sich bei diesen Symbolen nur um Alpha handelt. Das System zeichnet Benachrichtigungssymbole in Weiß und Aktionssymbole in Dunkelgrau. " Nun heißt das in Laienbezeichnungen" Alle Teile des Bildes, die Sie verwenden Ich möchte keine transparenten Pixel anzeigen. Alle Farben und nicht transparenten Pixel werden in Weiß angezeigt. "

Wie dies mit Screenshots ausführlich beschrieben wird, erfahren Sie hier https://blog.clevertap.com/fixing-notification-icon-for-Android-Lollipop-und-above/

Hoffentlich hilft das

2
Rohit Khanna

Sie müssen das einfarbige transparente PNG-Bild importieren. Sie können also die Symbolfarbe des kleinen Symbols einstellen. Ansonsten wird es in einigen Geräten wie MOTO weiß angezeigt

2
abhi.nalwade

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

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

setze ic_notification auf deine eigene ID von R.drawable.

1
Maxim Firsoff

FYI: Wenn das Symbol nicht angezeigt wird, stellen Sie sicher, dass Ihre lokale oder Remote-Benachrichtigungskonfiguration den richtigen Symbolnamen enthält, d. H 

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

Ich hatte auch zu viele Probleme, aber nachdem ich im ganzen Internet gesucht hatte, fand ich verschiedene Lösungen für dieses Problem. Lassen Sie mich alle Lösungen zusammenfassen und erklären:

Hinweis: Diese Lösung ist für Benutzer von Phonegap Cordova bestimmt

  1. Beispiel

<preference name="Android-targetSdkVersion" value="20"/>

Sie müssen Ihren Android-targetSdkVersion-Wert auf weniger als 21 ..__ setzen. Nachdem Sie diesen Wert festgelegt haben, wird das Benachrichtigungssymbolbild bis Android 6 (Marshmallow) angezeigt. Es funktioniert nicht in Android 7 (Nougat) . Diese Lösung hat bei mir funktioniert.

  1. Ändern Sie den statusbarStyle in Ihrer Konfigurationsdatei . Beispiel

<preference name="StatusBarStyle" value="lightcontent" />

Diese Lösung funktioniert jedoch nur, wenn Ihre App geöffnet ist .. __ Ich denke, diese Lösung ist nicht die beste Lösung, aber sie hat für viele Benutzer funktioniert.

  1. Machen Sie Ihr Symbol transparent .. Diese Lösung hat für viele Menschen funktioniert. Eigentlich ist die Sache: Bei der Entwicklung der Native-Anwendung müssen wir ihnen drei Bilder zur Verfügung stellen: (A) App-Symbol (B ) Benachrichtigungssymbol (C) Symbol für die Statusleiste, aber im Falle der Entwicklung von Hybrid-Mobilanwendungen gibt es keine Möglichkeit, dies zu tun ..__ Machen Sie also Ihr Symbol transparent und diese Lösung löst Ihr Problem.

Ich bin mir sicher, dass eine der oben genannten Lösungen für Ihr Problem geeignet ist.

0
Rinku kumar

Laut Dokumentation muss das Benachrichtigungssymbol weiß sein, da Android 3.0 (API Level 11) :

https://developer.Android.com/guide/practices/ui_guidelines/icon_design_status_bar

"Statusleistensymbole bestehen einfach aus weißen Pixeln auf einem transparenten Hintergrund, wobei Alpha-Überblendungen für glatte Kanten und gegebenenfalls interne Textur verwendet werden."

0
Laurent

Ich denke, es ist zu spät, um über API 21 zu sprechen, aber ich habe einen einfachen Weg gefunden.

Wenn Sie 'Benutzerdefinierte Benachrichtigung (benutzerdefiniertes Layout)' verwenden,

RemoteView's

setImageViewResource(int viewId, int srcId);

und

setImageViewUri(int viewId, Uri uri); 

macht das Bild auf Lollipop weiß (API 21).

Aber bei der Verwendung von

setImageViewBitmap(int viewId, Bitmap bitmap);

Bild wird nicht weiß maskiert!

0
Cake Lime