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?
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?
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:
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;
}
ctrl+f
und tippen notification
auf dieser Seite es nichts finden können ...
Stimmen Sie dem Benutzer Daniel Saidi voll und ganz zu. Zu haben , um Color
für NotificationIcon
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öchten Colors
. dh
Sie können Ihre Farbe mit hinzufügen
.setColor(your_color_resource_here)
HINWEIS: setColor
ist nur in verfügbar Lollipop
, Sie müssen dies überprüfenOSVersion
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 mit erreichen Lollipop
als Ziel erreichen SDK
.
Alle Anweisungen bezüglich NotificationIcon
den Benachrichtigungsleitlinien der Google Developer Console .
Bevorzugte Benachrichtigungssymbolgröße 24x24dp
mdpi @ 24.00dp = 24.00px
hdpi @ 24.00dp = 36.00px
xhdpi @ 24.00dp = 48.00px
Weitere Informationen finden Sie unter diesem Link für die Größe der Benachrichtigungssymbole .
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:
// 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 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
:
defaultConfig {
targetSdkVersion 20
}
Andernfalls (Eclipse usw.) verwenden Sie AndroidManifest.xml
:
<uses-sdk android:minSdkVersion="..." android:targetSdkVersion="20" />
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üfen Show option dialog
, überprüfen Save Transparent Color
, klicken Save
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 oder getNotificationIcon()
wie oben von Daniel Saidi vorgeschlagen.
Sie können auch das Android Asset Studio von Roman Nurik verwenden .
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
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
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.
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 Pre-Lollipop nur .setSmallIcon(R.mipmap.ic_launcher)
mit Ihrem Builder verwenden.
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: -
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.
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
Richtiges Symbol
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 haben Notification.Builder#setColor(int)
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 Hauptbenachrichtigungssymbol. Sie sollten davon ausgehen, dass diese Symbole nur Alpha-Symbole sind.
Fast alle eingebauten Drawables scheinen dafür geeignete Alpha-Bilder zu sein, daher können Sie Folgendes verwenden:
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.
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 Benachrichtigung
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ü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) auf ein Feld dieser Farbe gelegt wird. Alpha-Komponenten werden ignoriert.
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!)
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
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
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):
{
"to":"<fb_id>",
"priority" : "high",
"notification" :
{
"title" : "title",
"body" : "body" ,
"sound" : "default",
"icon" : "ic_notification"
}
}
Setzen Sie ic_notification von R.drawable auf Ihre eigene ID.
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.
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
setImageViewResource(int viewId, int srcId);
und
setImageViewUri(int viewId, Uri uri);
macht diese Bilder auf Lollipop (API 21) weiß.
Aber bei der Verwendung
setImageViewBitmap(int viewId, Bitmap bitmap);
Das Bild wird nicht weiß maskiert!
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
"Statusleistensymbole bestehen einfach aus weißen Pixeln auf einem transparenten Hintergrund, wobei die Alpha-Mischung gegebenenfalls für glatte Kanten und interne Texturen verwendet wird."
Mischen Sie diese beiden Dinge in App Gradle
defaultConfig {
applicationId "com.example.abdulwahidvi.notificationproblem"
minSdkVersion 16
//This is the version that was added by project by default
targetSdkVersion 26 <------ default
// Changed it to version 20
targetSdkVersion 20 <------ mine
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
android:targetSdkVersion="20"
es sollte <sein 21
.