Potrzebuję programu, który doda powiadomienie na Androida. A kiedy ktoś kliknie powiadomienie, powinno to doprowadzić go do mojej drugiej czynności.
Mam ustalony kod. Powiadomienie powinno działać, ale z jakiegoś powodu nie działa. W Notification
ogóle się nie wyświetla. Nie wiem, czego mi brakuje.
Kod tych plików:
Notification n = new Notification.Builder(this)
.setContentTitle("New mail from " + "[email protected]")
.setContentText("Subject")
.setContentIntent(pIntent).setAutoCancel(true)
.setStyle(new Notification.BigTextStyle().bigText(longText))
.build();
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Hide the notification after it's selected
notificationManager.notify(0, n);
android
notifications
Choudhury AM
źródło
źródło
Activity
nie jest uruchamiany? Czy to sięNotification
nie wyświetla?Odpowiedzi:
Kod nie będzie działał bez ikony. Więc dodaj
setSmallIcon
wywołanie do łańcucha budującego w ten sposób, aby zadziałało:Android Oreo (8.0) i nowsze
W systemie Android 8 wprowadzono nowe wymaganie dotyczące ustawiania
channelId
właściwości przy użyciu plikuNotificationChannel
.źródło
setChannelId
są wymagane. Zanim to dodam, powiadomienie pojawia się na moim urządzeniu SONY, ale nie na urządzeniu SAMSUNG.Android.OS.BuildVersionCodes.O
równa się 26?if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ mBuilder.setChannelId(channelId); }
ponieważ bez tego sprawdzenia powiadomienie nie pojawi się, nawet jeśli API twojego urządzenia> = 26.Właściwie odpowiedź ƒernando Valle nie wydaje się być poprawna. Z drugiej strony, twoje pytanie jest zbyt niejasne, ponieważ nie wspomniałeś, co jest nie tak lub nie działa.
Patrząc na twój kod, zakładam, że
Notification
po prostu się nie wyświetla.Twoje powiadomienie nie jest wyświetlane, ponieważ nie podano ikony. Chociaż dokumentacja SDK nie wspomina o tym, że jest to wymagane, w rzeczywistości jest to bardzo ważne i
Notification
bez niego nie zostanie wyświetlony.addAction
jest dostępny tylko od 4.1. Wcześniej używałbyśPendingIntent
do uruchomienia plikuActivity
. Wydaje się, że określasz aPendingIntent
, więc twój problem leży gdzie indziej. Logicznie rzecz biorąc, należy stwierdzić, że jest to brakująca ikona.źródło
Notification.Builder
, a nieNotificationCompat.Builder
tak, jak sugerujesz. Tylko dlatego, że istnieje biblioteka kompatybilności i można z niej korzystać, nie oznacza, że funkcja jest dostępna w normalnym API. Podany przez Ciebie link faktycznie to określa. To pytanie jest wyraźnie powiązaneNotification.Builder
, jak pokazuje przykład. Biblioteka zgodności prawdopodobnie zawierała tę funkcję dopiero po udostępnieniu wersji 4.1. Twoja odpowiedź jest myląca, ponieważ sugerujesz, że jest dostępna od 2.3.Brakowało małej ikony. Zrobiłem ten sam błąd i powyższy krok rozwiązał go.
Zgodnie z oficjalną dokumentacją: Obiekt powiadomienia musi zawierać:
Mała ikona ustawiana przez setSmallIcon ()
Tytuł ustawiany przez setContentTitle ()
Szczegółowy tekst, ustawiany przez setContentText ()
W systemie Android 8.0 (poziom interfejsu API 26) i nowszym prawidłowy identyfikator kanału powiadomień, ustawiany przez setChannelId () lub podany w konstruktorze NotificationCompat.Builder podczas tworzenia kanału.
Zobacz http://developer.android.com/guide/topics/ui/notifiers/notifications.html
źródło
To mnie dzisiaj zaskoczyło, ale zdałem sobie sprawę, że to dlatego, że na Androidzie 9.0 (Pie) funkcja Nie przeszkadzać domyślnie ukrywa również wszystkie powiadomienia, a nie tylko je wycisza, jak w Androidzie 8.1 (Oreo) i wcześniej. Nie dotyczy to powiadomień.
Lubię mieć włączone DND dla mojego urządzenia programistycznego, więc przejście do ustawień DND i zmiana ustawienia, aby po prostu wyciszyć powiadomienia (ale nie ukrywać ich), naprawiło to za mnie.
źródło
Tworzenie kanałów powiadomień jest obowiązkowe dla wersji Androida po Android 8.1 (Oreo), aby powiadomienia były widoczne. Jeśli powiadomienia nie są widoczne w Twojej aplikacji dla Oreo + Android, musisz wywołać następującą funkcję po uruchomieniu aplikacji -
źródło
Myślę, że zapomniałeś
Spójrz tutaj: Dodaj akcję
źródło
addAction()
nie jest dostępna wNotification.Builder
.Action
instancję, którą możesz utworzyć za pomocąNotification.Action.Builder
. PS, Zawsze używaj alternatywy Compat (tj. NotificationCompat), ponieważ Google ma tendencję do łatania błędów i zapewnia lepszą kompatybilność z nimi.setContentIntent(null)
z konstruktorem.Miałem ten sam problem z moją aplikacją na Androida. Próbowałem powiadomień i zauważyłem, że powiadomienia są wyświetlane na moim emulatorze Androida, który miał system Android 7.0 (Nougat), podczas gdy nie był on uruchomiony na moim telefonie z systemem Android 8.1 (Oreo).
Po przeczytaniu dokumentacji stwierdziłem, że Android ma funkcję zwaną kanałem powiadomień, bez której powiadomienia nie pojawią się na urządzeniach Oreo. Poniżej znajduje się link do oficjalnej dokumentacji Androida na temat kanałów powiadomień.
źródło
Dla mnie to był problem
deviceToken
. Sprawdź, czy token urządzenia odbiorcy i nadawcy jest prawidłowo zaktualizowany w Twojej bazie danych lub gdziekolwiek uzyskujesz do niego dostęp, aby wysyłać powiadomienia.Na przykład użyj poniższego, aby zaktualizować token urządzenia podczas uruchamiania aplikacji. Dlatego zawsze będzie odpowiednio aktualizowany.
źródło
deviceToken
deklarowane?onSuccess
pusty?onSuccess
- odnosiłem się do wewnętrznego (który jest pusty))Musisz także zmienić plik build.gradle i dodać do niego używaną wersję Android SDK:
W moim przypadku zadziałało to jak urok.
źródło
Powiadomienia mogą nie być wyświetlane, jeśli szybko wyświetlasz powiadomienia jedno po drugim lub anulujesz istniejące, a następnie od razu pokazujesz je ponownie (np. Aby wywołać powiadomienie typu heads-up, aby powiadomić użytkownika o zmianie w trwającym powiadomieniu). W takich przypadkach system może zdecydować o zablokowaniu powiadomienia, gdy uzna, że może stać się zbyt przytłaczające / spamerskie dla użytkownika.
Zwróć uwagę, że przynajmniej na standardowym Androidzie (testowanym z 10) z zewnątrz to zachowanie wygląda trochę przypadkowo: po prostu czasami się zdarza, a czasami nie. Domyślam się, że istnieje bardzo krótki próg czasowy, w którym nie możesz wysyłać zbyt wielu powiadomień. Dzwonienie,
NotificationManager.cancel()
a następnieNotificationManager.notify()
może czasami powodować takie zachowanie.Jeśli masz taką opcję, aktualizując powiadomienie, nie anuluj go wcześniej, ale po prostu zadzwoń
NotificationManager.notify()
ze zaktualizowanym powiadomieniem. Wydaje się, że nie powoduje to wspomnianego wcześniej blokowania przez system.źródło
Jeśli używasz wersji> = Android 8.1 (Oreo) podczas korzystania z kanału powiadomień, ustaw jego ważność na wysoką:
źródło