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:
-
Las configuraciones como el patrón de vibración especificado en el
NotificationChannel
anulan las especificadas en laNotification
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. -
No puede modificar la mayoría de las configuraciones de
NotificationChannel
después de haberlo pasado paracreateNotificationChannel()
. Ni siquiera puede llamar adeleteNotificationChannel()
y luego intentar volver a agregarlo. El uso de la ID de unNotificationChannel
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 asetSound()
incluso si nunca pasa un sonido personalizado).hasta que la Biblioteca de soporte cambie su código para usar la versión
setSound
desetSound
, 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