Powiadomienie systemu Android nie jest wyświetlane


115

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 Notificationogóle się nie wyświetla. Nie wiem, czego mi brakuje.

Kod tych plików:

Notification n = new Notification.Builder(this)
        .setContentTitle("New mail from " + "test@gmail.com")
        .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);

zadawaj pytania bardziej zwięźle. Nie wspominasz o tym, co nie działa. W rzeczywistości nawet nie wspominasz, że coś nie działa. Czy Activitynie jest uruchamiany? Czy to się Notificationnie wyświetla?
slinden77

3
@dmmh Powiedziałem w moim pytaniu, jaki jest mój problem! I nie znalazłem nic złego w pytaniu. Moje pytanie dotyczyło konkretnego problemu. Jeśli nie jesteś ekspertem, nie musisz szturchać! Odpowiedź tato469 była dobra.
Choudhury

3
Zwracam uwagę, że celem tej witryny nie jest dla Ciebie naprawianie problemów, ale także umożliwienie innym znalezienia rozwiązania problemów. Nie szturcham. Przykro mi, że zraniłem twoje uczucia, ale faktem jest, że twoje pytanie było błędne, odpowiedź była zła, a wszystkie te wprowadzające w błąd informacje doprowadzą do innych początkujących programistów, którzy mają ten sam problem, co opisujesz, uciekając się do wypróbowania rozwiązań, które nie działają na podstawie podanego przez Ciebie kodu. W żadnym wypadku nie ma znaczenia, czy jestem ekspertem, czy nie. Zwłaszcza, że ​​mam rację, twoje pytanie jest niejasne, a druga odpowiedź jest błędna.
slinden77

Mam zamiar poprosić o usunięcie tego pytania i odpowiedzi, ponieważ jest myląca. Miłego dnia.
slinden77

1
zmienił pytanie, aby ludzie mogli zrozumieć, na czym polega problem.
Choudhury

Odpowiedzi:


412

Kod nie będzie działał bez ikony. Więc dodaj setSmallIconwywołanie do łańcucha budującego w ten sposób, aby zadziałało:

.setSmallIcon(R.drawable.icon)

Android Oreo (8.0) i nowsze

W systemie Android 8 wprowadzono nowe wymaganie dotyczące ustawiania channelIdwłaściwości przy użyciu pliku NotificationChannel.

private NotificationManager mNotificationManager;

NotificationCompat.Builder mBuilder =
    new NotificationCompat.Builder(mContext.getApplicationContext(), "notify_001");
Intent ii = new Intent(mContext.getApplicationContext(), RootActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, ii, 0);

NotificationCompat.BigTextStyle bigText = new NotificationCompat.BigTextStyle();
bigText.bigText(verseurl);
bigText.setBigContentTitle("Today's Bible Verse");
bigText.setSummaryText("Text in detail");

mBuilder.setContentIntent(pendingIntent);
mBuilder.setSmallIcon(R.mipmap.ic_launcher_round);
mBuilder.setContentTitle("Your Title");
mBuilder.setContentText("Your text");
mBuilder.setPriority(Notification.PRIORITY_MAX);
mBuilder.setStyle(bigText);

mNotificationManager =
    (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);

// === Removed some obsoletes
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
    String channelId = "Your_channel_id";
    NotificationChannel channel = new NotificationChannel(
                                        channelId,
                                        "Channel human readable title",
                                        NotificationManager.IMPORTANCE_HIGH);
   mNotificationManager.createNotificationChannel(channel);
  mBuilder.setChannelId(channelId);
}

mNotificationManager.notify(0, mBuilder.build());

Jak zdobyć CHANNEL_ID? proszę o pomoc
Ananta Prasad

@LAnantaPrasad CHANNEL_ID ma być Twoim identyfikatorem. To jest to, według czego grupujesz powiadomienia, na przykład rozmowa na czacie lub czat grupowy.
Casey Daniel

Dzięki, setChannelIdsą wymagane. Zanim to dodam, powiadomienie pojawia się na moim urządzeniu SONY, ale nie na urządzeniu SAMSUNG.
Wesely


2
Uwzględnij również sprawdzenie, 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.
Koushik Shom Choudhury

58

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 Notificationpo 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 Notificationbez niego nie zostanie wyświetlony.

addActionjest dostępny tylko od 4.1. Wcześniej używałbyś PendingIntentdo uruchomienia pliku Activity. Wydaje się, że określasz a PendingIntent, więc twój problem leży gdzie indziej. Logicznie rzecz biorąc, należy stwierdzić, że jest to brakująca ikona.


znalazłem ten problem. Ale dzięki za właściwą odpowiedź. Doceniam twoją pomoc.
Choudhury AM

1
Powiedziałeś, że addAction jest dostępne dopiero od 4.1, ale jest błędne, użyłem go w 2.3. Podręcznik referencyjny mówi o przycisku, a nie o powiadomieniu: „Przyciski akcji nie pojawią się na platformach starszych niż Android 4.1”. możesz sprawdzić tutaj: AddAction jest zawarte w android.support.v4.app
ƒernando Valle

1
OP używa Notification.Builder, a nie NotificationCompat.Buildertak, 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ązane Notification.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.
slinden77

Przepraszam, jeśli się pomyliłem, mam na myśli to, że jest to możliwe w 2.3
ƒernando Valle

4
Ach, ikona !! Nawet nie zdawałem sobie sprawy, że go brakuje, ale dodanie go rozwiązało problem. Nie widziałem nic przydatnego w konsoli na temat brakującej ikony, wydaje się, że cicho zawiedzie.
Pete

33

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ć:

  1. Mała ikona ustawiana przez setSmallIcon ()

  2. Tytuł ustawiany przez setContentTitle ()

  3. Szczegółowy tekst, ustawiany przez setContentText ()

  4. 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


3
To nie jest prawda. Jeśli używasz niestandardowego układu powiadomień za pomocą setContent, nie jest wymagany tytuł ani tekst.
Ray Li

11

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.


9

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 -

private void createNotificationChannel() {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = getString(R.string.channel_name);
        String description = getString(R.string.channel_description);
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name,
       importance);
        channel.setDescription(description);
        // Register the channel with the system; you can't change the importance
        // or other notification behaviours after this
        NotificationManager notificationManager =
        getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
   }
}

1

Myślę, że zapomniałeś

addAction(int icon, CharSequence title, PendingIntent intent)

Spójrz tutaj: Dodaj akcję


1
metoda addAction()nie jest dostępna w Notification.Builder.
slinden77

1
Istnieje, ale jest przestarzała. Zamiast tego możesz przekazać Actioninstancję, 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
Gökhan Barış Aker

Jeśli nie chcesz określać żadnej akcji, po prostu użyj .setContentIntent(null)z konstruktorem.
Gökhan Barış Aker

1

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ń.


1

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.

// Device token for push notifications
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(
  new OnSuccessListener<InstanceIdResult>() {

    @Override
    public void onSuccess(InstanceIdResult instanceIdResult) {

        deviceToken = instanceIdResult.getToken();

        // Insert device token into Firebase database
        fbDbRefRoot.child("user_detail_profile").child(currentUserId).child("device_token")).setValue(deviceToken)
                .addOnSuccessListener(
                  new OnSuccessListener<Void>() {

                    @Override
                    public void onSuccess(Void aVoid) {

                    }
                });
    }
});

Gdzie to jest deviceTokendeklarowane?
Peter Mortensen

Dlaczego jest onSuccesspusty?
Peter Mortensen

@PeterMortensen .. po sukcesie możesz zrobić wszystko, na co pozwala twoja logika, np. Rozpocząć nowy zamiar, wznieść toast lub pozostać na tej samej stronie. Jeśli chodzi o deklarację deviceToken, możesz zadeklarować go jako Private String deviceToken przed onCreate na swojej stronie
DragonFire

(Aby mój własny komentarz był jaśniejszy: są dwa onSuccess- odnosiłem się do wewnętrznego (który jest pusty))
Peter Mortensen

1

Musisz także zmienić plik build.gradle i dodać do niego używaną wersję Android SDK:

implementation 'com.android.support:appcompat-v7:28.0.0'

W moim przypadku zadziałało to jak urok.


0

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ępnie NotificationManager.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.


-1

Jeśli używasz wersji> = Android 8.1 (Oreo) podczas korzystania z kanału powiadomień, ustaw jego ważność na wysoką:

int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);

1
Co masz na myśli, mówiąc „jedna wersja> =” ? Czy masz na myśli „w wersji 8.1 (lub nowszej)” ? Prosimy o odpowiedź, edytując odpowiedź , a nie w komentarzach (w stosownych przypadkach).
Peter Mortensen

@PeterMortensen, przepraszam za to, że to był tylko typ dzięki za poprawienie mnie
Faisal Naseer
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.