studio notification notificaciones notificacion name codigo basica app android push-notification android-8.0-oreo android-8.1-oreo

notification - Las notificaciones no se muestran en Android Oreo(API 26)



notification android channel id (4)

Recibo este mensaje cuando intento mostrar una notificación en Android O.

El uso de los tipos de flujo está en desuso para operaciones distintas al control de volumen

La notificación proviene directamente de los documentos de ejemplo y se muestra bien en Android 25.


A partir de Android O, debe configurar un NotificationChannel y hacer referencia a ese canal cuando intente mostrar una notificación.

private static final int NOTIFICATION_ID = 1; private static final String NOTIFICATION_CHANNEL_ID = "my_notification_channel"; ... NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "My Notifications", NotificationManager.IMPORTANCE_DEFAULT); // Configure the notification channel. notificationChannel.setDescription("Channel description"); notificationChannel.enableLights(true); notificationChannel.setLightColor(Color.RED); notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000}); notificationChannel.enableVibration(true); notificationManager.createNotificationChannel(notificationChannel); } NotificationCompat.Builder builder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID) .setVibrate(new long[]{0, 100, 100, 100, 100, 100}) .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("Content Title") .setContentText("Content Text"); notificationManager.notify(NOTIFICATION_ID, builder.build());

Un par de notas importantes:

  1. Las configuraciones como el patrón de vibración especificado en el NotificationChannel anulan las especificadas en la Notification real. Lo sé, es contra-intuitivo. Debe mover la configuración que cambiará a la Notificación o usar un NotificationChannel diferente para cada configuración.
  2. No puede modificar la mayoría de las configuraciones de NotificationChannel después de haberlo pasado para createNotificationChannel() . Ni siquiera puede llamar a deleteNotificationChannel() y luego intentar volver a agregarlo. El uso de la ID de un NotificationChannel eliminado lo resucitará y será tan inmutable como cuando se creó por primera vez. Continuará usando la configuración anterior hasta que se desinstale la aplicación. Por lo tanto, es mejor que esté seguro de la configuración de su canal y reinstale la aplicación si está jugando con esa configuración para que surta efecto.

En Android O es imprescindible usar un NotificationChannel y NotificationCompat.Builder está en desuso ( reference ).

A continuación se muestra un código de muestra:

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); NotificationManager mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel("notify_001", "Channel human readable title", NotificationManager.IMPORTANCE_DEFAULT); mNotificationManager.createNotificationChannel(channel); } mNotificationManager.notify(0, mBuilder.build());


Según los comentarios en esta publicación de Google+ :

esas [advertencias] se esperan actualmente cuando se usa NotificationCompat en dispositivos Android O ( NotificationCompat siempre llama a setSound() incluso si nunca pasa un sonido personalizado).

hasta que la Biblioteca de soporte cambie su código para usar la versión setSound de setSound , siempre recibirá esa advertencia.

Por lo tanto, no hay nada que pueda hacer al respecto. Según la guía de canales de notificación , Android O desprecia la configuración de un sonido en una notificación individual, en lugar de tener que configurar el sonido en un canal de notificación utilizado por todas las notificaciones de un tipo particular.


Todo lo que @ sky-kelsey ha descrito es bueno, solo adiciones menores :

No debe registrar el mismo canal cada vez si ya se ha registrado, por lo que tengo el método de clase Utils que crea un canal para mí:

public static final String NOTIFICATION_CHANNEL_ID_LOCATION = "notification_channel_location"; public static void registerLocationNotifChnnl(Context context) { if (Build.VERSION.SDK_INT >= 26) { NotificationManager mngr = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); if (mngr.getNotificationChannel(NOTIFICATION_CHANNEL_ID_LOCATION) != null) { return; } // NotificationChannel channel = new NotificationChannel( NOTIFICATION_CHANNEL_ID_LOCATION, context.getString(R.string.notification_chnnl_location), NotificationManager.IMPORTANCE_LOW); // Configure the notification channel. channel.setDescription(context.getString(R.string.notification_chnnl_location_descr)); channel.enableLights(false); channel.enableVibration(false); mngr.createNotificationChannel(channel); } }

strings.xml:

<string name="notification_chnnl_location">Location polling</string> <string name="notification_chnnl_location_descr">You will see notifications on this channel ONLY during location polling</string>

Y llamo al método cada vez antes de mostrar una notificación del tipo:

... NotificationUtil.registerLocationNotifChnnl(this); return new NotificationCompat.Builder(this, NotificationUtil.NOTIFICATION_CHANNEL_ID_LOCATION) .addAction(R.mipmap.ic_launcher, getString(R.string.open_app), activityPendingIntent) .addAction(android.R.drawable.ic_menu_close_clear_cancel, getString(R.string.remove_location_updates), servicePendingIntent) .setContentText(text) ...

Otro problema típico - sonido predeterminado del canal - descrito aquí: https://.com/a/45920861/2133585