La notificación de Android no se muestra

115

Necesito un programa que agregue una notificación en Android. Y cuando alguien hace clic en la notificación, debería llevarlos a mi segunda actividad.

He establecido un código. La notificación debería estar funcionando, pero por alguna razón no funciona. No Notificationse ve en absoluto. No sé qué me estoy perdiendo.

Código de esos archivos:

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);
Choudhury AM
fuente
Intente ser más conciso cuando haga preguntas. No menciona lo que no funciona. De hecho, ni siquiera mencionas que algo no funciona. ¿ ActivityNo se está lanzando? ¿ NotificationNo se muestra?
slinden77
3
@dmmh dije en mi pregunta ¿cuál es mi problema? Y no encontré nada malo en la pregunta. Mi pregunta fue específica sobre el problema. Si no eres un experto, ¡no necesitas pinchar! Y la respuesta de tato469 estuvo bien.
Choudhury AM
3
Estoy señalando que el propósito de este sitio no es que usted resuelva sus problemas, sino que otros también puedan encontrar una solución a los problemas. No estoy pinchando. Lamento haber herido sus sentimientos, pero el hecho es que su pregunta fue incorrecta, la respuesta fue incorrecta y toda esta información engañosa llevará a otros programadores novatos, que tienen el mismo problema que usted describe, a buscar soluciones que no funcionan. basado en el código que USTED proporcionó. En ningún caso es relevante o no si soy un experto o no. Especialmente no porque tengo razón, su pregunta es vaga y la otra respuesta es incorrecta.
slinden77
Voy a pedir que se elimine esta pregunta y la respuesta, ya que es engañosa. Tenga un buen día.
slinden77
1
cambió la pregunta, para que la gente pueda entender cuál es el problema.
Choudhury AM

Respuestas:

412

El código no funcionará sin un icono. Entonces, agregue la setSmallIconllamada a la cadena de construcción de esta manera para que funcione:

.setSmallIcon(R.drawable.icon)

Android Oreo (8.0) y superior

Android 8 introdujo un nuevo requisito de configurar la channelIdpropiedad mediante un 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());
Md Imran Choudhury
fuente
¿Cómo obtener CHANNEL_ID? por favor ayuda
Ananta Prasad
@LAnantaPrasad CHANNEL_ID está destinado a ser un identificador para ti. Es por lo que agrupa las notificaciones, como una conversación de chat o un chat grupal.
Casey Daniel
Gracias, setChannelIdse requieren. Antes de agregar eso, la notificación se muestra en mi dispositivo SONY pero no en el dispositivo SAMSUNG.
Wesely
2
También incluya la verificación, if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ mBuilder.setChannelId(channelId); }ya que sin esta verificación, la notificación no aparecerá, incluso si la API de su dispositivo> = 26.
Koushik Shom Choudhury
58

En realidad, la respuesta de ƒernando Valle no parece correcta. Por otra parte, su pregunta es demasiado vaga porque no menciona lo que está mal o no funciona.

Mirando su código, supongo que Notificationsimplemente no se muestra.

Su notificación no se muestra porque no proporcionó un icono. Aunque la documentación del SDK no menciona que sea necesario, de hecho lo es mucho y Notificationno se mostrará sin uno.

addActionsolo está disponible desde 4.1. Antes de eso, usaría PendingIntentpara iniciar un Activity. Parece que especificas a PendingIntent, por lo que tu problema está en otra parte. Lógicamente, hay que concluir que es el icono que falta.

slinden77
fuente
Encontré ese problema. Pero gracias por la respuesta adecuada. Realmente aprecio tu ayuda.
Choudhury AM
1
Dijiste que addAction solo está disponible desde la 4.1 pero está mal, lo usé en 2.3. El manual de referencia habla del botón, no de la notificación: "Los botones de acción no aparecerán en plataformas anteriores a Android 4.1". puede verificar aquí: AddAction está incluido en android.support.v4.app
ƒernando Valle
1
El OP está usando Notification.Builder, no NotificationCompat.Builder, como está sugiriendo. El hecho de que haya una biblioteca de compatibilidad y se pueda usar no significa que la función esté disponible en la API normal. El enlace que proporcionas realmente lo estipula. Esta pregunta está claramente relacionada con Notification.Builder, como muestra el ejemplo. Y la biblioteca de compatibilidad probablemente solo incluyó esta función después de que 4.1 estuviera disponible. Su respuesta es engañosa, porque ahora sugiere que ha estado disponible desde la 2.3.
slinden77
Perdón si me hablé mal, quiero decir que es posible en 2.3
ƒernando Valle
4
¡¡Argh el icono !! Ni siquiera me di cuenta de que faltaba, pero agregarlo solucionó el problema. No vi nada útil en la consola sobre un ícono que falta, parece fallar en silencio.
Pete
33

Faltaba el icono pequeño. Cometí el mismo error y el paso anterior lo resolvió.

Según la documentación oficial: Un objeto de notificación debe contener lo siguiente:

  1. Un pequeño icono, establecido por setSmallIcon ()

  2. Un título, establecido por setContentTitle ()

  3. Texto detallado, establecido por setContentText ()

  4. En Android 8.0 (API nivel 26) y versiones posteriores , un ID de canal de notificación válido, establecido por setChannelId () o proporcionado en el constructor NotificationCompat.Builder al crear un canal.

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

Vijay Srinivasan
fuente
3
Esto no es verdad. Si usa un diseño de notificación personalizado con setContent, no se requiere título ni texto.
Ray Li
11

Esto me hizo tropezar hoy, pero me di cuenta de que era porque en Android 9.0 (Pie), No molestar por defecto también oculta todas las notificaciones, en lugar de silenciarlas como en Android 8.1 (Oreo) y antes. Esto no se aplica a las notificaciones.

Me gusta tener DND activado para mi dispositivo de desarrollo, así que entrar en la configuración de DND y cambiar la configuración para simplemente silenciar las notificaciones (pero no ocultarlas) me lo arregló.

Chee-Yi
fuente
9

La creación de canales de notificación es obligatoria para las versiones de Android posteriores a Android 8.1 (Oreo) para hacer visibles las notificaciones. Si las notificaciones no están visibles en su aplicación para Oreo + Androids, debe llamar a la siguiente función cuando se inicie su aplicación:

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);
   }
}
Amit Jaiswal
fuente
1

Creo que olvidas el

addAction(int icon, CharSequence title, PendingIntent intent)

Mira aquí: Agregar acción

ƒernando Valle
fuente
1
el método addAction()no está disponible en Notification.Builder.
slinden77
1
Existe, pero en desuso. En su lugar, puede pasar una Actioninstancia con la que puede crear Notification.Action.Builder. PD, siempre use la alternativa de Compat (es decir, NotificationCompat), ya que Google tiende a parchear errores y proporcionar una mejor compatibilidad con ellos
Gökhan Barış Aker
Si no desea especificar ninguna acción, utilícela .setContentIntent(null)con el constructor.
Gökhan Barış Aker
1

Tuve el mismo problema con mi aplicación de Android. Estaba probando notificaciones y descubrí que se mostraban notificaciones en mi emulador de Android que ejecutaba un sistema Android 7.0 (Nougat), mientras que no se estaba ejecutando en mi teléfono que tenía Android 8.1 (Oreo).

Después de leer la documentación, descubrí que Android tenía una función llamada canal de notificación, sin la cual las notificaciones no aparecerían en los dispositivos Oreo. A continuación se muestra el enlace a la documentación oficial de Android sobre los canales de notificación.

SHIVAM CHAUDHARY
fuente
1

Para mí fue un problema deviceToken. Verifique si el token del dispositivo receptor y remitente está actualizado correctamente en su base de datos o en cualquier lugar al que acceda para enviar notificaciones.

Por ejemplo, use lo siguiente para actualizar el token del dispositivo al iniciar la aplicación. Por lo tanto, siempre se actualizará correctamente.

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

                    }
                });
    }
});
Fuego de Dragon
fuente
¿Dónde se deviceTokendeclara esto ?
Peter Mortensen
¿Por qué está onSuccessvacío?
Peter Mortensen
@PeterMortensen ... si tienes éxito, puedes hacer lo que tu lógica te permita, como comenzar una nueva intención, brindar o permanecer en la misma página. En cuanto a la declaración deviceToken, puede declararlo como una cadena privada deviceToken antes de onCreate en su página
DragonFire
(Para hacer mi propio comentario más claro: hay dos onSuccesss - me refería al interior (que está vacío))
Peter Mortensen
1

También debe cambiar el archivo build.gradle y agregarle la versión usada del SDK de Android:

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

Esto funcionó de maravilla en mi caso.

Ashwin Balani
fuente
0

Es posible que las notificaciones no se muestren si muestra las notificaciones rápidamente una tras otra o si cancela una existente y luego la muestra de nuevo inmediatamente (por ejemplo, para activar una notificación de aviso para notificar al usuario sobre un cambio en una notificación en curso). En estos casos, el sistema puede decidir simplemente bloquear la notificación cuando sienta que podría resultar demasiado abrumadora / spam para el usuario.

Tenga en cuenta que, al menos en Android estándar (probado con 10) desde el exterior, este comportamiento parece un poco aleatorio: a veces sucede y otras no. Supongo que hay un límite de tiempo muy corto durante el cual no se le permite enviar demasiadas notificaciones. Llamar NotificationManager.cancel()y luego a NotificationManager.notify()veces puede causar este comportamiento.

Si tiene la opción, cuando actualice una notificación, no la cancele antes, solo llame NotificationManager.notify()con la notificación actualizada. Esto no parece desencadenar el bloqueo mencionado anteriormente por parte del sistema.

ubuntudroid
fuente
-1

Si está en la versión> = Android 8.1 (Oreo) mientras usa un canal de notificación, establezca su importancia en alta:

int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
Faisal Naseer
fuente
1
¿Qué quieres decir con "una versión> =" ? ¿Quiere decir "en la versión 8.1 (o superior)" ? Responda editando su respuesta , no aquí en los comentarios (según corresponda).
Peter Mortensen
@PeterMortensen perdóname por eso, fue solo un tipo gracias por corregirme
Faisal Naseer