Mam aplikację wyświetlającą niestandardowe powiadomienia. Problem polega na tym, że w systemie Android 5 mała ikona na pasku powiadomień jest wyświetlana na biało. Jak mogę to naprawić?
Mam aplikację wyświetlającą niestandardowe powiadomienia. Problem polega na tym, że w systemie Android 5 mała ikona na pasku powiadomień jest wyświetlana na biało. Jak mogę to naprawić?
Odpowiedzi:
Przyjęta odpowiedź nie jest (całkowicie) poprawna. Jasne, sprawia, że ikony powiadomień są wyświetlane w kolorze, ale robi to z WIELKĄ wadą - ustawiając docelowy zestaw SDK na niższy niż Android Lollipop!
Jeśli rozwiążesz problem z białą ikoną, ustawiając docelowy zestaw SDK na 20, zgodnie z sugestią, twoja aplikacja nie będzie atakować Androida Lollipop, co oznacza, że nie możesz używać funkcji specyficznych dla Lollipop.
Spójrz na http://developer.android.com/design/style/iconography.html , a zobaczysz, że biały styl to sposób wyświetlania powiadomień w Android Lollipop.
W Lollipop Google sugeruje również użycie koloru, który będzie wyświetlany za (białą) ikoną powiadomienia - https://developer.android.com/about/versions/android-5.0-changes.html
Myślę więc, że lepszym rozwiązaniem jest dodanie ikony sylwetki do aplikacji i użycie jej, jeśli urządzenie ma system Android Lollipop.
Na przykład:
Notification notification = new Notification.Builder(context)
.setAutoCancel(true)
.setContentTitle("My notification")
.setContentText("Look, white in Lollipop, else color!")
.setSmallIcon(getNotificationIcon())
.build();
return notification;
I w metodzie 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;
}
ctrl+f
i wpisując notification
na tej stronie nie można znaleźć niczego ...
Całkowicie zgadzam się z użytkownikiem Danielem Saidi. Aby mieć Color
dla NotificationIcon
Piszę tę odpowiedź.
W tym celu musisz zrobić ikonę podobną Silhouette
i zrobić sekcję Transparent
gdziekolwiek chcesz dodać swoją Colors
. to znaczy,
Możesz dodać swój kolor za pomocą
.setColor(your_color_resource_here)
UWAGA: setColor
jest dostępna tylko w, Lollipop
więc musisz sprawdzićOSVersion
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)
...
}
Możesz to również osiągnąć, używając Lollipop
jako celu SDK
.
Wszystkie instrukcje dotyczące NotificationIcon
podane w wierszach Przewodnika powiadomień Google Developer Console .
Preferowana ikona powiadomienia Rozmiar 24x24dp
mdpi @ 24.00dp = 24.00px
hdpi @ 24.00dp = 36.00px
xhdpi @ 24.00dp = 48.00px
Aby uzyskać więcej informacji, zapoznaj się z tym linkiem dla rozmiarów ikon powiadomień .
setColor
na Kitkat (API 19) i IceCreamSandwich (API 15), w obu przypadkach zignorował kolor, ale nie zawiesił się . Czy mogę bezpiecznie pominąć sprawdzanie wersji systemu operacyjnego?
Oto kod, którego używa Android do wyświetlania ikon powiadomień:
// 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);
}
Musisz więc ustawić docelową wersję SDK na coś, <21
a ikony pozostaną kolorowe. Jest to brzydkie obejście, ale działa zgodnie z oczekiwaniami. W każdym razie proponuję przestrzegać Wytycznych projektowych Google : „Ikony powiadomień muszą być całkowicie białe”.
Oto jak możesz to zaimplementować:
Jeśli używasz Gradle / Android Studio do tworzenia aplikacji, użyj build.gradle
:
defaultConfig {
targetSdkVersion 20
}
W przeciwnym razie (Eclipse itp.) Użyj AndroidManifest.xml
:
<uses-sdk android:minSdkVersion="..." android:targetSdkVersion="20" />
Aby uniknąć zmiany koloru ikon powiadomień na białe, użyj dla nich ikon „Sylwetka”, tj. białe tło przezroczyste. Możesz użyć Irfanview do ich zbudowania:
IrfanView
, naciśnij F12 dla narzędzi do malowania, w razie potrzeby wyczyść obraz (usuń niechciane części, wygładź i wypoleruj)Image / Decrease Color Depth
do 2 (dla obrazu czarno-białego)Image / Negative
(dla obrazu czarno-białego)Image / Resize/Resample
do 144 x 144 (użyj metody rozmiaru „Zmień rozmiar”, a nie „Zmień próbkę”, w przeciwnym razie obraz zostanie ponownie zwiększony do 24 bitów koloru na piksel (24 BPP)File / Save as PNG
, zaznacz Show option dialog
, zaznacz Save Transparent Color
, kliknij Save
, a następnie kliknij czarny kolor na obrazie, aby ustawić kolor przezroczystyWygląda na to, że Android używa tylko rozdzielczości obrazu do rysowania xxhdpi (144 x 144), więc skopiuj ic_notification.png
plik wynikowy do \AndroidStudio\Projects\...\app\src\main\res\drawable-xxhdpi
. Użyj .setSmallIcon(R.drawable.ic_notification)
w swoim kodzie lub użyj, getNotificationIcon()
jak sugerował powyżej Daniel Saidi.
Możesz także użyć Android Asset Studio Romana Nurika .
Inną opcją jest skorzystanie z rysowanych katalogów (mipmap) specyficznych dla wersji, aby dostarczyć inną grafikę dla Lollipop i wyższych.
W mojej aplikacji katalogi „v21” zawierają ikony z przezroczystym tekstem, podczas gdy inne katalogi zawierają wersję nieprzezroczystą (dla wersji Androida starszych niż Lollipop).
Który powinien wyglądać mniej więcej tak:
W ten sposób nie musisz sprawdzać numerów wersji w kodzie, np
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);
Podobnie możesz odwoływać się do „ic_notification” (lub jakkolwiek chcesz to nazwać) w ładunku GCM, jeśli użyjesz atrybutu „icon”.
https://developers.google.com/cloud-messaging/http-server-ref#notification-payload-support
setColor
(bez dodatkowego kodu) w ten sposób?
Zgodnie z wytycznymi projektowymi Androida musisz użyć sylwetki. builder.setSmallIcon(R.drawable.some_notification_icon);
Ale jeśli nadal chcesz wyświetlać kolorową ikonę jako ikonę powiadomienia, oto sztuczka dla Lollipopa i powyżej użyj poniższego kodu. LargeIcon będzie działać jako główna ikona powiadomienia, a także musisz podać sylwetkę smallIcon, ponieważ będzie ona wyświetlana w prawym dolnym rogu dużegoIcon.
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));
}
I tylko do użytku przed Lollipopem .setSmallIcon(R.mipmap.ic_launcher)
z twoim konstruktorem.
Teraz studio Android udostępnia wtyczkę Image Asset , która będzie generować ikonę we wszystkich wymaganych folderach drawbale
Zasób obrazu Studio pomaga tworzyć różne typy ikon o różnych gęstościach i pokazuje dokładnie, gdzie zostaną umieszczone w twoim projekcie. Zawiera narzędzia do dostosowywania ikon i dodawania tła, a wszystko to podczas wyświetlania wyniku w okienku podglądu, dzięki czemu wyglądają dokładnie tak, jak zamierzałeś. Narzędzia te mogą znacznie usprawnić proces projektowania i importowania ikon.
Możesz uzyskać dostęp do Zasobu obrazu , klikając nowy> kliknij opcję Zasób obrazu, a pojawi się następujące okno: -
Napotkałem ten sam problem i to dlatego, że ikona powiadomienia mojej aplikacji nie była płaska. W przypadku wersji Androida Lollipop lub nawet poniżej Lollipop ikona powiadomienia aplikacji powinna być płaska, nie należy używać ikony z cieniami itp.
Poniżej znajduje się kod, który działał idealnie we wszystkich wersjach Androida.
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());
}
Zła ikona
Prawa ikona
kanał alfa to jedyne dane obrazu używanego przez system Android do ikon powiadomień:
alpha == 1
: piksele pokazują bielalpha == 0
: piksele są wyświetlane jako wybrany kolor Notification.Builder#setColor(int)
Wspomniano o tym na stronie https://developer.android.com/about/versions/android-5.0-changes.html :
System ignoruje wszystkie kanały inne niż alfa w ikonach akcji i głównej ikonie powiadomienia. Powinieneś założyć, że te ikony będą tylko alfa.
Prawie wszystkie wbudowane rysunki wydają się być odpowiednimi obrazami alfa do tego celu, więc możesz użyć czegoś takiego:
Notification.Builder.setColor(Color.RED)
.setSmallIcon(android.R.drawable.star_on)
ale wciąż szukam dokumentu API, który oficjalnie to potwierdza.
Testowane na Androidzie 22.
setColor
na Kitkat (API 19) i IceCreamSandwich (API 15), w obu przypadkach zignorował kolor, ale nie zawiesił się . Czy mogę bezpiecznie pominąć sprawdzanie wersji systemu operacyjnego?
usuń android:targetSdkVersion="21"
plik manifest.xml. to będzie działać! i z tego nie ma żadnego problemu w twojej aplikacji, to tylko sztuczka, którą stosuję i znalazłem kolorową ikonę w powiadomieniu
Powiadomienia są w skali szarości jak wyjaśniono poniżej. Nie są czarno-białe, pomimo tego, co napisali inni. Prawdopodobnie widziałeś ikony z wieloma odcieniami, takie jak paski siły sieci.
Przed API 21 (Lollipop 5.0) kolorowe ikony działały. Możesz wymusić na aplikacji celowanie w API 20, ale to ogranicza funkcje dostępne dla twojej aplikacji, więc nie jest to zalecane. Możesz przetestować działający poziom interfejsu API i odpowiednio ustawić ikonę koloru lub ikonę skali szarości, ale prawdopodobnie nie jest to opłacalne. W większości przypadków najlepiej jest użyć ikony w skali szarości.
Obrazy mają cztery kanały, RGBA (czerwony / zielony / niebieski / alfa). W przypadku ikon powiadomień system Android ignoruje kanały R, G i B. Jedyny kanał, który się liczy, to Alpha, znana również jako krycie. Zaprojektuj swoją ikonę za pomocą edytora, który daje kontrolę nad wartością alfa kolorów rysowania.
Jak wartości alfa generują obraz w skali szarości:
Zmieniając to za pomocą setColor
:
Zadzwoń NotificationCompat.Builder.setColor(int argb)
. Z dokumentacji dla Notification.color
:
Kolor akcentu (liczba całkowita ARGB, taka jak stałe w kolorze), która ma być stosowana przez standardowe szablony stylu podczas prezentacji tego powiadomienia. Obecny projekt szablonu tworzy kolorowy obraz nagłówka, nakładając obraz ikony (oznaczony kolorem białym) na pole tego koloru. Składniki alfa są ignorowane.
Moje testy z setColor pokazują, że komponenty Alpha nie są ignorowane; zamiast tego nadal zapewniają skalę szarości. Wyższe wartości alfa powodują, że piksel staje się biały. Niższe wartości alfa zmieniają piksel na kolor tła (czarny na moim urządzeniu) w obszarze powiadomień lub na określony kolor w rozwijanym powiadomieniu. (Wygląda na to, że inni zgłaszali nieco inne zachowanie, więc bądź świadomy!)
Po wydaniu Androida Lollipop Android zmienił wytyczne dotyczące wyświetlania ikon powiadomień na pasku powiadomień. Oficjalna dokumentacja mówi: „Zaktualizuj lub usuń zasoby, które wymagają koloru. System ignoruje wszystkie kanały inne niż alfa w ikonach akcji i w głównej ikonie powiadomienia. Należy założyć, że te ikony będą tylko alfa. System rysuje ikony powiadomień w kolorze białym i ikony akcji w kolorze ciemnoszarym ”. To, co oznacza to w kategoriach laików, to „Konwertuj wszystkie części obrazu, których nie chcesz wyświetlać, na przezroczyste piksele. Wszystkie kolory i nieprzezroczyste piksele są wyświetlane w kolorze białym ”
Możesz zobaczyć, jak to zrobić szczegółowo za pomocą zrzutów ekranu tutaj https://blog.clevertap.com/fixing-notification-icon-for-android-lollipop-and-above/
Mam nadzieję, że to pomaga
Musisz zaimportować jednokolorowy przezroczysty obraz PNG. Możesz więc ustawić kolor ikony małej ikony. W przeciwnym razie będzie wyświetlany w kolorze białym w niektórych urządzeniach, takich jak MOTO
Jeśli korzystasz z GoogleFireBaseMessaging, możesz ustawić „id ikony” w ładunku „powiadomienia” (pomaga mi to rozwiązać problem z ikoną białego paska):
{
"to":"<fb_id>",
"priority" : "high",
"notification" :
{
"title" : "title",
"body" : "body" ,
"sound" : "default",
"icon" : "ic_notification"
}
}
ustaw ic_notification na swój własny identyfikator z R.drawable.
Ja też napotkałem zbyt wiele problemów, ale po przeszukaniu Internetu znalazłem różne rozwiązania tego problemu. Pozwól, że podsumuję wszystkie rozwiązania i wyjaśnię:
Uwaga: To rozwiązanie jest przeznaczone dla użytkowników Cordon firmy Phonegap
<preference name="android-targetSdkVersion" value="20"/>
Musisz ustawić wartość Androida-targetSdkVersion na mniejszą niż 21. Tak więc po ustawieniu tej wartości Obraz ikony powiadomienia pojawi się do Androida 6 (Marshmallow), nie będzie działał w Androidzie 7 (Nougat). To rozwiązanie działało dla mnie.
<preference name="StatusBarStyle" value="lightcontent" />
Ale to rozwiązanie będzie działać tylko po otwarciu aplikacji. Myślę, że to rozwiązanie nie jest najlepszym rozwiązaniem, ale działało dla wielu użytkowników.
Jestem pewien, że jedno z powyższych rozwiązań zadziała w przypadku Twojego problemu.
Myślę, że jest za późno, aby mówić o API 21, ale znalazłem łatwy sposób.
Podczas korzystania z „Powiadomień niestandardowych (układ niestandardowy)”
RemoteView's
setImageViewResource(int viewId, int srcId);
i
setImageViewUri(int viewId, Uri uri);
sprawia, że te obrazy są białe na Lollipop (API 21).
Ale podczas używania
setImageViewBitmap(int viewId, Bitmap bitmap);
Obraz nie zostaje zamaskowany na biało!
Zgodnie z dokumentacją ikona powiadomienia musi być biała od Androida 3.0 (API Level 11) :
https://developer.android.com/guide/practices/ui_guidelines/icon_design_status_bar
„Ikony paska stanu składają się po prostu z białych pikseli na przezroczystym tle, z mieszaniem alfa używanym do gładkich krawędzi i wewnętrznej tekstury, tam gdzie to stosowne”.
zmieszaj te dwie rzeczy w aplikacji
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"
powinno być < 21
.