La notifica Android non viene visualizzata


115

Ho bisogno di un programma che aggiunga una notifica su Android. E quando qualcuno fa clic sulla notifica, dovrebbe portarlo alla mia seconda attività.

Ho stabilito il codice. La notifica dovrebbe funzionare, ma per qualche motivo non funziona. Non Notificationsi vede affatto. Non so cosa mi sto perdendo.

Codice di quei file:

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);

per favore cerca di essere più conciso quando fai domande. Non dici cosa non funziona. In effetti, non dici nemmeno che qualcosa non funziona. Non Activityè stato lanciato? Non Notificationsi vede?
slinden77

3
@ dmmh ho detto nella mia domanda qual è il mio problema! E non ho trovato niente di sbagliato nella domanda. La mia domanda era specifica sul problema. Se non sei un esperto non c'è bisogno di colpire! E la risposta di tato469 andava bene.
Choudhury AM

3
Sottolineo che lo scopo di questo sito non è che tu risolva i tuoi problemi, ma che anche altri siano in grado di trovare una soluzione ai problemi. Non sto frugando. Mi dispiace di aver ferito i tuoi sentimenti, ma il fatto è che la tua domanda era sbagliata, la risposta era sbagliata e tutte queste informazioni fuorvianti porteranno altri programmatori inesperti, che hanno lo stesso problema che descrivi, a ricorrere a soluzioni che non funzionano in base al codice fornito da TE. In nessun caso è rilevante o meno se sono un esperto o meno. Soprattutto perché ho ragione, la tua domanda è vaga e l'altra risposta è sbagliata.
slinden77

Chiederò di rimuovere questa domanda e la risposta poiché è fuorviante. Buona giornata.
slinden77

1
cambiato la domanda, in modo che le persone possano capire qual è il problema.
Choudhury AM

Risposte:


412

Il codice non funzionerà senza un'icona. Quindi, aggiungi la setSmallIconchiamata alla catena del builder in questo modo affinché funzioni:

.setSmallIcon(R.drawable.icon)

Android Oreo (8.0) e versioni successive

Android 8 ha introdotto un nuovo requisito per impostare la channelIdproprietà utilizzando un file 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());

Come ottenere CHANNEL_ID? per favore aiuto
Ananta Prasad

@LAnantaPrasad CHANNEL_ID è pensato per essere un identificatore per te. È ciò per cui raggruppa le notifiche, come una conversazione in chat o una chat di gruppo.
Casey Daniel

Grazie, setChannelIdsono obbligatori. Prima di aggiungerlo, la notifica viene visualizzata sul mio dispositivo SONY ma non sul dispositivo SAMSUNG.
Wesely


2
Includere anche il controllo if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ mBuilder.setChannelId(channelId); }poiché senza questo controllo, la notifica non verrà visualizzata, anche se l'API del dispositivo> = 26.
Koushik Shom Choudhury

58

In realtà la risposta di ƒernando Valle non sembra essere corretta. Poi di nuovo, la tua domanda è eccessivamente vaga perché non dici cosa è sbagliato o non funziona.

Guardando il tuo codice presumo che Notificationsemplicemente non venga visualizzato.

La tua notifica non viene visualizzata perché non hai fornito un'icona. Anche se la documentazione dell'SDK non menziona che è necessario, in realtà lo è molto e Notificationnon verrà visualizzato senza uno.

addActionè disponibile solo dalla 4.1. Prima di questo dovresti usare il PendingIntentper avviare un file Activity. Sembra che tu specifichi a PendingIntent, quindi il tuo problema è altrove. Logicamente, si deve concludere che è l'icona mancante.


ho trovato quel problema. Ma grazie per la risposta adeguata. Apprezzo molto il vostro aiuto.
Choudhury AM

1
Hai detto che addAction è disponibile solo dalla 4.1 ma è sbagliato, l'ho usato nella 2.3. Il manuale di riferimento parla del pulsante non della notifica: "I pulsanti di azione non verranno visualizzati sulle piattaforme precedenti ad Android 4.1". puoi controllare qui: AddAction è incluso in android.support.v4.app
ƒernando Valle

1
L'OP sta usando Notification.Builder, non NotificationCompat.Builder, come stai suggerendo. Solo perché esiste una libreria di compatibilità e può essere utilizzata, non significa che la funzione sia disponibile nella normale API. Il collegamento fornito lo prevede effettivamente. Questa domanda è chiaramente correlata Notification.Builder, come mostra l'esempio. E la libreria di compatibilità probabilmente includeva questa funzione solo dopo che la 4.1 era disponibile. La tua risposta è fuorviante, perché ora suggerisci che è disponibile dalla 2.3.
slinden77

Scusa se ho detto male, voglio dire che è possibile in 2.3
ƒernando Valle

4
Argh l'icona !! Non mi rendevo nemmeno conto che mancava, ma aggiungendolo ha risolto il problema. Non ho visto nulla di utile nella console su un'icona mancante, sembra non riuscire silenziosamente.
Pete

33

Ti mancava la piccola icona. Ho fatto lo stesso errore e il passaggio precedente lo ha risolto.

Come da documentazione ufficiale: un oggetto di notifica deve contenere quanto segue:

  1. Una piccola icona, impostata da setSmallIcon ()

  2. Un titolo, impostato da setContentTitle ()

  3. Testo dettagliato, impostato da setContentText ()

  4. In Android 8.0 (livello API 26) e versioni successive , un ID canale di notifica valido, impostato da setChannelId () o fornito nel costruttore NotificationCompat.Builder durante la creazione di un canale.

Vedi http://developer.android.com/guide/topics/ui/notifiers/notifications.html


3
Questo non è vero. Se utilizzi un layout di notifica personalizzato utilizzando setContent, non è richiesto alcun titolo o testo.
Ray Li

11

Questo mi ha fatto inciampare oggi, ma mi sono reso conto che era perché su Android 9.0 (Pie), Non disturbare per impostazione predefinita nasconde anche tutte le notifiche, invece di silenziarle come in Android 8.1 (Oreo) e precedenti. Questo non si applica alle notifiche.

Mi piace avere DND attivo per il mio dispositivo di sviluppo, quindi andare nelle impostazioni DND e modificare l'impostazione per silenziare semplicemente le notifiche (ma non nasconderle) lo ha risolto per me.


9

La creazione di canali di notifica è obbligatoria per le versioni di Android successive ad Android 8.1 (Oreo) per rendere visibili le notifiche. Se le notifiche non sono visibili nella tua app per Oreo + Androids, devi chiamare la seguente funzione all'avvio dell'app:

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

Penso che tu abbia dimenticato il file

addAction(int icon, CharSequence title, PendingIntent intent)

Guarda qui: Aggiungi azione


1
il metodo addAction()non è disponibile su Notification.Builder.
slinden77

1
Esiste, ma è deprecato. Invece, puoi passare Actionun'istanza con cui puoi creare Notification.Action.Builder. PS, usa sempre l'alternativa Compat (cioè NotificationCompat), poiché Google tende a correggere i bug e fornisce una migliore compatibilità con loro
Gökhan Barış Aker

Se non vuoi specificare alcuna azione, usala semplicemente .setContentIntent(null)con il builder.
Gökhan Barış Aker

1

Ho avuto lo stesso problema con la mia app Android. Stavo provando le notifiche e ho scoperto che le notifiche venivano visualizzate sul mio emulatore Android che eseguiva un sistema Android 7.0 (Nougat), mentre non era in esecuzione sul mio telefono con Android 8.1 (Oreo).

Dopo aver letto la documentazione, ho scoperto che Android aveva una funzionalità chiamata canale di notifica, senza la quale le notifiche non verranno visualizzate sui dispositivi Oreo. Di seguito è riportato il collegamento alla documentazione ufficiale di Android sui canali di notifica.


1

Per me è stato un problema con deviceToken. Controlla se il token del dispositivo del destinatario e del mittente è aggiornato correttamente nel tuo database o ovunque tu acceda per inviare notifiche.

Ad esempio, utilizzare quanto segue per aggiornare il token del dispositivo all'avvio dell'app. Pertanto sarà sempre aggiornato correttamente.

// 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) {

                    }
                });
    }
});

Dove viene deviceTokendichiarato?
Peter Mortensen

Perché è onSuccessvuoto?
Peter Mortensen

@PeterMortensen .. in caso di successo puoi fare tutto ciò che la tua logica consente, come iniziare un nuovo intento, fare un brindisi o rimanere sulla stessa pagina. Per quanto riguarda la dichiarazione deviceToken puoi dichiararla come stringa privata deviceToken prima di onCreate nella tua pagina
DragonFire

(Per rendere più chiaro il mio commento: ci sono due onSuccesss - mi riferivo a quello interno (che è vuoto))
Peter Mortensen

1

È inoltre necessario modificare il file build.gradle e aggiungere la versione di Android SDK utilizzata al suo interno:

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

Questo ha funzionato come un fascino nel mio caso.


0

Le notifiche potrebbero non essere visualizzate se si visualizzano rapidamente le notifiche una dopo l'altra o se ne cancella una esistente, per poi mostrarle subito di nuovo (ad es. Per attivare una notifica di avviso per notificare all'utente una modifica in una notifica in corso). In questi casi il sistema può decidere di bloccare la notifica solo quando ritiene che possa diventare troppo travolgente / spam per l'utente.

Si noti che almeno su Android di serie (testato con 10) dall'esterno questo comportamento sembra un po 'casuale: a volte accade e altre volte no. La mia ipotesi è che esiste una soglia di tempo molto breve durante la quale non è consentito inviare troppe notifiche. La chiamata NotificationManager.cancel()e quindi a NotificationManager.notify()volte potrebbe causare questo comportamento.

Se hai la possibilità, quando aggiorni una notifica non annullarla prima, ma chiama semplicemente NotificationManager.notify()con la notifica aggiornata. Ciò non sembra attivare il blocco di cui sopra da parte del sistema.


-1

Se sei sulla versione> = Android 8.1 (Oreo) mentre usi un canale di notifica, imposta la sua importanza su alta:

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

1
Cosa intendi con "una versione> =" ? Intendi "nella versione 8.1 (o superiore)" ? Si prega di rispondere modificando la tua risposta , non qui nei commenti (a seconda dei casi).
Peter Mortensen,

@PeterMortensen scusatemi per questo era solo un tipo grazie per avermi corretto
Faisal Naseer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.