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ć?
android
android-notifications
android-5.0-lollipop
Alejandro Casanova
źródło
źródło
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:
I w metodzie getNotificationIcon:
źródło
ctrl+f
i wpisującnotification
na tej stronie nie można znaleźć niczego ...Całkowicie zgadzam się z użytkownikiem Danielem Saidi. Aby mieć
Color
dlaNotificationIcon
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
Możesz to również osiągnąć, używając
Lollipop
jako celuSDK
.Wszystkie instrukcje dotyczące
NotificationIcon
podane w wierszach Przewodnika powiadomień Google Developer Console .Preferowana ikona powiadomienia Rozmiar 24x24dp
Aby uzyskać więcej informacji, zapoznaj się z tym linkiem dla rozmiarów ikon powiadomień .
źródło
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ń:
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
:W przeciwnym razie (Eclipse itp.) Użyj
AndroidManifest.xml
:źródło
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
, zaznaczShow option dialog
, zaznaczSave Transparent Color
, kliknijSave
, 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 .
źródło
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
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
źródło
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.I tylko do użytku przed Lollipopem
.setSmallIcon(R.mipmap.ic_launcher)
z twoim konstruktorem.źródło
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: -
źródło
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.
Zła ikona
Prawa ikona
źródło
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 kolorNotification.Builder#setColor(int)
Wspomniano o tym na stronie https://developer.android.com/about/versions/android-5.0-changes.html :
Prawie wszystkie wbudowane rysunki wydają się być odpowiednimi obrazami alfa do tego celu, więc możesz użyć czegoś takiego:
ale wciąż szukam dokumentu API, który oficjalnie to potwierdza.
Testowane na Androidzie 22.
źródło
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źródło
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 dlaNotification.color
: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!)
źródło
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
źródło
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
źródło
Jeśli korzystasz z GoogleFireBaseMessaging, możesz ustawić „id ikony” w ładunku „powiadomienia” (pomaga mi to rozwiązać problem z ikoną białego paska):
ustaw ic_notification na swój własny identyfikator z R.drawable.
źródło
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.
źródło
FYI: Jeśli ikona nie pojawi się, upewnij się, że lokalna lub zdalna konfiguracja powiadomień zawiera prawidłową nazwę ikony, tj
źródło
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
i
sprawia, że te obrazy są białe na Lollipop (API 21).
Ale podczas używania
Obraz nie zostaje zamaskowany na biało!
źródł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
źródło
zmieszaj te dwie rzeczy w aplikacji
źródło
android:targetSdkVersion="20"
powinno być <21
.źródło