Moja aplikacja generuje powiadomienie, ale ikona, którą ustawiłem dla tego powiadomienia, nie jest wyświetlana. Zamiast tego otrzymuję biały kwadrat.
Próbowałem zmienić rozmiar png ikony (wymiary 720x720, 66x66, 44x44, 22x22). Co ciekawe, przy mniejszych wymiarach biały kwadrat jest mniejszy.
Wygooglowałem ten problem, jak również poprawny sposób generowania powiadomień iz tego co wyczytałem mój kod powinien być poprawny. Niestety nie jest tak, jak powinno.
Mój telefon to Nexus 5 z systemem Android 5.1.1. Problem występuje również na emulatorach, Samsung Galaxy s4 z Androidem 5.0.1 i Motorola Moto G z Androidem 5.0.1 (oba pożyczyłem i nie mam teraz)
Poniżej kod powiadomień i dwa zrzuty ekranu. Jeśli potrzebujesz więcej informacji, poproś o nie.
Dziękuję wam wszystkim.
@SuppressLint("NewApi") private void sendNotification(String msg, String title, String link, Bundle bundle) {
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class);
resultIntent.putExtras(bundle);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
resultIntent, Intent.FLAG_ACTIVITY_NEW_TASK);
Notification notification;
Uri sound = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.notificationsound);
notification = new Notification.Builder(this)
.setSmallIcon(R.drawable.lg_logo)
.setContentTitle(title)
.setStyle(new Notification.BigTextStyle().bigText(msg))
.setAutoCancel(true)
.setContentText(msg)
.setContentIntent(contentIntent)
.setSound(sound)
.build();
notificationManager.notify(0, notification);
}
źródło
Odpowiedzi:
Przyczyna: W przypadku wersji 5.0 Lollipop „Ikony powiadomień muszą być całkowicie białe”.
Rozwiązanie dla docelowego Sdk 21
Jeśli chcesz obsługiwać ikony materiałów Lollipop, utwórz przezroczyste ikony dla wersji Lollipop i nowszych. Zobacz: https://design.google.com/icons/
Zajrzyj na http://developer.android.com/design/style/iconography.html , a zobaczymy, że biały styl to sposób wyświetlania powiadomień w Android Lollipop.
W Lollipopie Google sugeruje również użycie koloru, który będzie wyświetlany za białą ikoną powiadomienia. Odnieś Link: https://developer.android.com/about/versions/android-5.0-changes.html
Gdziekolwiek chcemy dodać kolory https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#setColor(int)
Implementacja Notification Builder dla wersji Lollipop OS poniżej i powyżej będzie wyglądać następująco:
Uwaga: funkcja setColor jest dostępna tylko w Lollipop i wpływa tylko na tło ikony.
To całkowicie rozwiąże Twój problem !!
źródło
Jeśli korzystasz z Google Cloud Messaging, ten problem nie zostanie rozwiązany przez zwykłą zmianę ikony. Na przykład to nie zadziała:
Nawet jeśli ic_notification jest przezroczysty i biały. Musi być również zdefiniowany w metadanych Manifest, na przykład:
Metadane są umieszczane pod
application
tagiem, w celach informacyjnych.źródło
res/drawable/ic_notification.png
o rozmiarze 196x196?Meta-data
sugestią tagu.Naprawdę sugeruję przestrzeganie wytycznych Google dotyczących projektowania :
z komunikatem „Ikony powiadomień muszą być całkowicie białe”.
źródło
Zadeklaruj ten kod w manifeście systemu Android:
Mam nadzieję, że to ci się przyda.
źródło
ic_stat_name
? Czy to jeden png? czy to dużo? proszę pomóż!(Android Studio 3.5) Jeśli posiadasz najnowszą wersję Android Studio, możesz wygenerować obrazy powiadomień. Kliknij prawym przyciskiem myszy folder res > Nowy> Zasób obrazu . Następnie zobaczysz Konfiguruj zasoby obrazu, jak pokazano na poniższym obrazku. Change Icon Type do powiadomień Ikony . Twoje obrazy muszą być białe i przezroczyste. Ta opcja Konfiguruj zasoby obrazu wymusi tę regułę. Ważne: jeśli chcesz, aby ikony były używane do powiadomień w chmurze / push, musisz dodać metadane pod tagiem aplikacji, aby korzystać z nowo utworzonych ikon powiadomień.
źródło
Możemy zrobić jak poniżej:
Utwórz nowy obiekt kreatora powiadomień i wywołaj go
setSmallIcon()
za pomocą obiektu kreatora powiadomień, jak w poniższym kodzie.Utwórz metodę, w której sprawdzimy, na jakiej wersji systemu operacyjnego instalujemy naszą aplikację. Jeśli jest poniżej Lolipop, czyli API 21, przyjmie zwykłą ikonę aplikacji z kolorem tła, w przeciwnym razie przyjmie przezroczystą ikonę aplikacji bez tła. Zatem urządzenia korzystające z wersji systemu operacyjnego> = 21 ustawią kolor tła ikony za pomocą metody
setColor()
klasy Notification builder.Przykładowy kod:
źródło
setColor
na Kitkat (API 19) i IceCreamSandwich (API 15), w obu przypadkach zignorował kolor, ale się nie zawiesił . Czy mogę więc bezpiecznie pominąć sprawdzanie wersji systemu operacyjnego?Spróbuj tego
napotkałem ten sam problem, próbowałem wielu odpowiedzi, ale nie znalazłem żadnych rozwiązań, w końcu znalazłem sposób na rozwiązanie mojego problemu.
- zrób ikonę powiadomienia z przezroczystym tłem. Szerokość i wysokość aplikacji musi być taka jak poniżej i wklej to wszystko w swoim projekcie-> app-> src-> main-> res
MDPI 24 * 24
HDPI 36 * 36
XHDPI 48 * 48
XXHDPI 72 * 72
po powyższym wklej poniższy wiersz w swojej metodzie onMessageReceived
Nie zapomnij dodać tego kodu w pliku manifestu
źródło
dodaj tę linię do pliku manifest.xml w bloku aplikacji
źródło
Jeśli chcesz zapewnić ikonę powiadomienia pomocy technicznej Lollipop, utwórz ikonę powiadomienia dwóch typów:
Teraz ustaw odpowiednią ikonę do konstruktora powiadomień w czasie wykonywania w wersji systemu operacyjnego:
źródło
Wreszcie mam rozwiązanie tego problemu.
Ten problem występuje tylko wtedy, gdy aplikacja w ogóle nie jest uruchomiona. (ani w tle, ani na pierwszym planie) . Gdy aplikacja działa na pierwszym planie lub w tle, ikona powiadomienia jest wyświetlana prawidłowo . (Nie biały kwadrat)
Musimy więc ustawić taką samą konfigurację ikony powiadomień w interfejsach API zaplecza, co we Frontend.
We frontendzie użyliśmy React Native, a do powiadomień push wykorzystaliśmy pakiet act-native-fcm npm .
Użyliśmy pakietu fcm-push npm przy użyciu Node.js jako zaplecza dla powiadomień wypychanych i ustawiliśmy strukturę ładunku w następujący sposób.
To, co w zasadzie wyszukuje dla obrazu notification_icon przechowywanego lokalnie w naszym systemie Android.
źródło
Powiadomienia są w skali szarości jak wyjaśniono poniżej. Nie są czarno-białe, wbrew temu, co napisali inni. Prawdopodobnie widziałeś ikony z wieloma odcieniami, takie jak paski siły sieci.
Przed API 21 (Lollipop 5.0) działają kolorowe ikony. Możesz wymusić na aplikacji docelowe API 20, ale ogranicza to funkcje dostępne dla aplikacji, więc nie jest to zalecane. Możesz przetestować działający poziom interfejsu API i odpowiednio ustawić ikonę koloru lub ikonę w skali szarości, ale prawdopodobnie nie jest to opłacalne. W większości przypadków najlepiej jest wybrać ikonę 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. Jedynym kanałem, który się liczy, jest alfa, znany również jako krycie. Zaprojektuj swoją ikonę za pomocą edytora, który zapewnia kontrolę nad wartością alfa kolorów rysowania.
Jak wartości alfa generują obraz w skali szarości:
Zmiana tego za pomocą
setColor
:Zadzwoń
NotificationCompat.Builder.setColor(int argb)
. Z dokumentacji dlaNotification.color
:Moje testy z setColor pokazują, że komponenty Alpha nie są ignorowane. Wyższe wartości alfa powodują zmianę koloru piksela na biały. Niższe wartości alfa powodują zmianę koloru piksela na kolor tła (czarny na moim urządzeniu) w obszarze powiadomień lub kolor określony w rozwijanym powiadomieniu.
źródło
Rozwiązałem problem dodając poniższy kod do manifestu,
gdzie
ic_stat_name
utworzono w Android Studio Kliknij prawym przyciskiem myszy na res >> Nowy >> Zasoby obrazu >> IconType (Powiadomienie)I jeszcze jeden krok, który muszę zrobić po stronie php serwera z ładunkiem powiadomienia
Zwróć uwagę na sekcję
gdzie nazwa ikony
"icon" => "ic_stat_name"
powinna być taka sama jak zestaw w manifeście.źródło
Wymagania dotyczące rozwiązania tego problemu:
Format obrazu: 32-bitowy PNG (z alfa)
Obraz powinien być przezroczysty
Indeks koloru przezroczystości: biały (FFFFFF)
Źródło: http://gr1350.blogspot.com/2017/01/problem-with-setsmallicon.html
źródło
Znalazłem link, w którym możemy wygenerować własną białą ikonę,
Otwórz ten link i prześlij swój ic_launcher lub ikonę powiadomienia
źródło
Możesz użyć różnych ikon dla różnych wersji. Po prostu ustaw logikę swojej ikony w następujący sposób:
źródło
Dla SDK> = 23 dodaj setLargeIcon
źródło
Aby zredukować określone wersje SDK, możesz po prostu zrobić to: (zamień „#” na „0x”)
źródło
0xFF169AB9
, brakuje ci całkowicie nieprzezroczystego kanału alfa.Jeśli chcesz zachować kolorową ikonę - Obejście problemu
Dodaj piksel o nieco innym kolorze do ikony.
W moim przypadku mam czarną ikonę z odcieniami i światłem. Po dodaniu ciemnoniebieskiego piksela działa.
źródło
Mam podobny problem na Androidzie 8.0. Spróbuj użyć BIAŁEGO zasobu ikon. Mam biały kwadrat, kiedy próbuję użyć kolorowego obrazu dla ikony, kiedy zastępuję go białą ikoną, zaczyna działać.
źródło