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?
android
android-notifications
android-5.0-lollipop
Alejandro Casanova
quelle
quelle
Antworten:
Die akzeptierte Antwort ist nicht (vollständig) korrekt. Sicher, Benachrichtigungssymbole werden in Farbe angezeigt, aber mit einem großen Nachteil - indem Sie das Ziel-SDK auf einen niedrigeren Wert als Android Lollipop einstellen!
Wenn Sie Ihr Problem mit weißen Symbolen lösen, indem Sie Ihr Ziel-SDK wie vorgeschlagen auf 20 setzen, zielt Ihre App nicht auf Android Lollipop ab. Dies bedeutet, dass Sie keine Lollipop-spezifischen Funktionen verwenden können.
Schauen Sie sich http://developer.android.com/design/style/iconography.html an , werden Sie feststellen, 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. https://developer.android.com/about/versions/android-5.0-changes.html
Daher denke ich, dass eine bessere Lösung darin besteht, der App ein Silhouettensymbol hinzuzufügen und es zu verwenden, wenn auf dem Gerät Android Lollipop ausgeführt wird.
Zum Beispiel:
Und in der getNotificationIcon-Methode:
quelle
ctrl+f
und tippennotification
auf dieser Seite es nichts finden können ...Stimmen Sie dem Benutzer Daniel Saidi voll und ganz zu. Zu haben , um
Color
fürNotificationIcon
mich diese Antwort hier schreibe.Dafür musst du ein Symbol wie
Silhouette
machen und einen Abschnitt machenTransparent
erstellen, wo immer Sie Ihre hinzufügen möchtenColors
. dhSie können Ihre Farbe mit hinzufügen
.setColor(your_color_resource_here)
HINWEIS:
setColor
ist nur in verfügbarLollipop
, Sie müssen dies überprüfenOSVersion
Sie können dies auch mit erreichen
Lollipop
als Ziel erreichenSDK
.Alle Anweisungen bezüglich
NotificationIcon
den Benachrichtigungsleitlinien der Google Developer Console .Bevorzugte Benachrichtigungssymbolgröße 24x24dp
Weitere Informationen finden Sie unter diesem Link für die Größe der Benachrichtigungssymbole .
quelle
setColor
auf 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?Dies ist der Code, mit dem Android Benachrichtigungssymbole anzeigt:
Sie müssen also die Ziel-SDK-Version auf etwas einstellen,
<21
und die Symbole bleiben farbig. Dies ist eine hässliche Problemumgehung, aber sie macht das, was von ihr erwartet wird. Auf jeden Fall empfehle ich wirklich, die Designrichtlinien von Google zu befolgen : "Benachrichtigungssymbole müssen vollständig weiß sein."So können Sie es implementieren:
Wenn Sie Gradle / Android Studio zum Erstellen Ihrer Apps verwenden, verwenden Sie
build.gradle
:Andernfalls (Eclipse usw.) verwenden Sie
AndroidManifest.xml
:quelle
Um zu vermeiden, dass Benachrichtigungssymbole weiß werden, verwenden Sie für sie "Silhouette" -Symbole, z. weiß-auf-transparent-Hintergrundbilder. Sie können Irfanview verwenden , um sie zu erstellen:
IrfanView
, drücken Sie F12 für die Malwerkzeuge, reinigen Sie das Bild bei Bedarf (entfernen Sie unerwünschte Teile, glätten und polieren Sie es).Image / Decrease Color Depth
bis 2 (für ein Schwarzweißbild)Image / Negative
(für ein Weiß auf Schwarz Bild)Image / Resize/Resample
auf 144 x 144 (verwenden Sie die Größenmethode "Größe ändern", nicht "Neu abtasten", andernfalls wird das Bild erneut auf 24 Farbbits pro Pixel (24 BPP) erhöhtFile / Save as PNG
, prüfenShow option dialog
, überprüfenSave Transparent Color
, klickenSave
und dann auf die schwarze Farbe im Bild klicken , um die transparente Farbe festzulegenAndroid verwendet anscheinend nur die Bildauflösung drawable-xxhdpi (144 x 144). Kopieren Sie also das Ergebnis
ic_notification.png
Datei in\AndroidStudio\Projects\...\app\src\main\res\drawable-xxhdpi
. Verwenden Sie es.setSmallIcon(R.drawable.ic_notification)
in Ihrem Code odergetNotificationIcon()
wie oben von Daniel Saidi vorgeschlagen.Sie können auch das Android Asset Studio von Roman Nurik verwenden .
quelle
Eine weitere Option besteht darin, die versionenspezifischen Drawable-Verzeichnisse (Mipmap-Verzeichnisse) zu nutzen, 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 eine nicht transparente Version enthalten (für Versionen von Android, die älter als Lollipop sind).
Welches sollte ungefähr so aussehen:
Auf diese Weise müssen Sie nicht nach Versionsnummern im Code suchen, z
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
quelle
setColor
(ohne zusätzlichen Code) auf diese Weise einstellen ?Gemäß den Android-Designrichtlinien müssen Sie eine Silhouette für verwenden.
builder.setSmallIcon(R.drawable.some_notification_icon);
Wenn Sie jedoch weiterhin ein farbenfrohes Symbol als Benachrichtigungssymbol anzeigen möchten, ist dies der Trick für Lollipop und höher. Verwenden Sie den folgenden Code. Das largeIcon fungiert als primäres Benachrichtigungssymbol, und Sie müssen auch eine Silhouette für smallIcon angeben, die unten rechts auf dem largeIcon angezeigt wird.Und Pre-Lollipop nur
.setSmallIcon(R.mipmap.ic_launcher)
mit Ihrem Builder verwenden.quelle
Jetzt bietet Android Studio ein Plugin Image Asset an , das ein Symbol in allen erforderlichen Drawbale-Ordnern generiert
Mit Image Asset Studio können Sie verschiedene Arten von Symbolen mit unterschiedlichen Dichten erstellen und genau anzeigen, wo sie in Ihrem Projekt platziert werden. Es enthält Tools zum Anpassen Ihrer Symbole und zum Hinzufügen von Hintergründen, während das Ergebnis in einem Vorschaufenster angezeigt wird, sodass sie genau so angezeigt werden, wie Sie es beabsichtigt haben. Diese Tools können das Design und den Import von Symbolen erheblich optimieren.
Sie können auf Image Asset zugreifen, indem Sie auf Neu klicken> auf die Option Image Asset klicken. Das folgende Fenster wird angezeigt: -
quelle
Ich hatte das gleiche Problem und es lag daran, dass mein App-Benachrichtigungssymbol nicht flach war. Für Android-Version Lollipop oder sogar unter Lollipop sollte Ihr App-Benachrichtigungssymbol flach sein, verwenden Sie kein Symbol mit Schatten usw.
Unten ist der Code, der auf allen Android-Versionen einwandfrei funktioniert hat.
Falsches Symbol
Richtiges Symbol
quelle
Alpha-Kanal 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 ausgewählt habenNotification.Builder#setColor(int)
Dies wird unter https://developer.android.com/about/versions/android-5.0-changes.html erwähnt :
Fast alle eingebauten Drawables scheinen dafür geeignete Alpha-Bilder zu sein, daher können Sie Folgendes verwenden:
Aber ich suche immer noch nach dem API-Dokument , das dies offiziell bestätigt.
Getestet auf Android 22.
quelle
setColor
auf 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?Entfernen Sie die Datei
android:targetSdkVersion="21"
aus manifest.xml. es wird klappen! und von diesem gibt es überhaupt kein Problem in Ihrer apk es ist nur ein Trick, den ich anwende und ich fand buntes Symbol in der Benachrichtigungquelle
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:
Ändern mit
setColor
:Rufen Sie an
NotificationCompat.Builder.setColor(int argb)
. Aus der Dokumentation fürNotification.color
:Meine Tests mit setColor zeigen, dass Alpha-Komponenten nicht ignoriert werden. Stattdessen bieten sie immer noch Graustufen. 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. (Es scheint, dass andere etwas anderes Verhalten gemeldet haben, seien Sie sich also bewusst!)
quelle
Post android Lollipop Release Android hat die Richtlinien für die Anzeige von Benachrichtigungssymbolen in der Benachrichtigungsleiste geändert. In der offiziellen Dokumentation heißt es: "Aktualisieren oder Entfernen von Elementen, die Farbe enthalten. Das System ignoriert alle Nicht-Alpha-Kanäle in Aktionssymbolen und im Hauptbenachrichtigungssymbol. Sie sollten davon ausgehen, dass diese Symbole nur Alpha-Symbole sind. Das System zeichnet Benachrichtigungssymbole in Weiß und Aktionssymbole in Dunkelgrau. “ Für Laien bedeutet dies nun: "Konvertieren Sie alle Teile des Bildes, die Sie nicht anzeigen möchten, in transparente Pixel. Alle Farben und nicht transparenten Pixel werden in Weiß angezeigt. "
Wie das geht, erfahren Sie im Detail anhand von Screenshots hier https://blog.clevertap.com/fixing-notification-icon-for-android-lollipop-and-above/
hoffentlich hilft das
quelle
Sie müssen das einfarbige transparente PNG-Bild importieren. So können Sie die Symbolfarbe des kleinen Symbols einstellen. Andernfalls wird es bei einigen Geräten wie MOTO weiß angezeigt
quelle
Wenn Sie GoogleFireBaseMessaging verwenden, können Sie "Symbol-ID" in der Nutzlast "Benachrichtigung" festlegen (dies hilft mir, das Problem mit dem weißen Balkensymbol zu lösen):
Setzen Sie ic_notification von R.drawable auf Ihre eigene ID.
quelle
Ich hatte auch zu viele Probleme, aber nachdem ich im 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 gedacht
<preference name="android-targetSdkVersion" value="20"/>
Sie müssen Ihren android-targetSdkVersion-Wert auf weniger als 21 einstellen. Nachdem Sie diesen Wert festgelegt haben, wird das Benachrichtigungssymbolbild bis Android 6 (Marshmallow) angezeigt. In Android 7 (Nougat) funktioniert es nicht. Diese Lösung hat bei mir funktioniert.
<preference name="StatusBarStyle" value="lightcontent" />
Diese Lösung funktioniert jedoch nur, wenn Ihre App geöffnet wird. Ich denke, diese Lösung ist nicht die beste Lösung, aber sie hat für viele Benutzer funktioniert.
Und ich bin sicher, dass eine der oben genannten Lösungen für Ihr Problem geeignet ist.
quelle
Zu Ihrer Information: Wenn das Symbol nicht angezeigt wird, stellen Sie sicher, dass Ihre lokale oder Remote-Benachrichtigungskonfiguration den richtigen Symbolnamen enthält, d. H.
quelle
Ich denke, es ist zu spät, um über API 21 zu sprechen, aber ich habe einen einfachen Weg gefunden.
Bei Verwendung von "Benutzerdefinierte Benachrichtigung (benutzerdefiniertes Layout)"
RemoteView's
und
macht diese Bilder auf Lollipop (API 21) weiß.
Aber bei der Verwendung
Das Bild wird nicht weiß maskiert!
quelle
Laut Dokumentation muss das Benachrichtigungssymbol seit Android 3.0 (API Level 11) weiß sein :
https://developer.android.com/guide/practices/ui_guidelines/icon_design_status_bar
quelle
Mischen Sie diese beiden Dinge in App Gradle
quelle
android:targetSdkVersion="20"
es sollte <sein21
.quelle