Loupe

Android Oreo : afficher une notification locale en utilisant NotificationChannel

Android 8.0, nom de code Oreo est disponible depuis bientôt un an (sa sortie était fin avril 2017) et il apporte quelques changements au niveau du SDK. L'une d'entre elles n'est pas anodine : les notifications locales sans canal de Notification ne sont plus affichées. Nous verrons dans cet article comment migrer notre code pour le refaire fonctionner.

TL;DR;

  1. Créer un NotificationChannel s'il n'existe pas,
  2. L'utiliser dans le NotificationBuilder.

NotificationChannel

Un canal de notification représente un type de notification affiché par votre application à l'utilisateur. Auparavant, il pouvait configurer le comportement des notifications par application et dorénavant il peut le faire par "canal d'une application".

Il est donc possible par exemple pour une application de gestion d'alarmes/timer d'activer la LED pour les minuteries mais de la désactiver pour l'alarme car cela pique un peu les yeux au réveil. Le nombre et la configuration initiale des canaux d'une application reste à la charge de celle-ci et il est possible de créer un seul canal pour contenir toutes les notifications. Voici l'écran de configuration des canaux de notification dans la documentation Android :

 channel-settings_2x.png

Il est obligatoire d'assigner chaque notification de votre application à un canal sans quoi elle ne s'affichera pas.

Créer un canal

Le correctif à appliquer à vos applications existantes est alors assez simple : on créé un canal s'il n'existe pas et on l'utilise pour créer des notifications. Aussi, on prendra soin de s'assurer de la version du SDK utilisée par l'OS au runtime et de disposer le canal à la fin car l'on ne s'en sert plus.

if (Android.OS.Build.VERSION.SdkInt 
   >= Android.OS.BuildVersionCodes.O)
{
   const string CHANNEL_ID = "TV SHOW TRACKER";
   const string channelName = "TOUTES LES NOTIFICATIONS";
   var notificationManager = (NotificationManager)context
  .GetSystemService(Context.NotificationService);

   var channel = notificationManager.GetNotificationChannel(
               CHANNEL_ID);
   if (channel == null)
   {
   channel = new NotificationChannel(
   CHANNEL_ID, 
   channelName, 
   NotificationImportance.High);
   notificationManager.CreateNotificationChannel(channel);
   }
   channel?.Dispose();
}

Aussi, vous l'avez vu dans l'extrait de code, il est nécessaire de choisir un niveau d'importance pour les notifications. Attention, une fois celle-ci assignée et le canal créé, il n'est plus possible de la modifier. 

  • IMPORTANCE_HIGH : Joue un son (si activé sur le device) et affiche un toast disruptif. Exite
  • IMPORTANCE_DEFAULT : Joue un son.
  • IMPORTANCE_LOW : Aucun son, uniquement apparition dans le notification drawer et la barre de statut.
  • IMPORTANCE_MIN : Aucun son, uniquement dans le notification drawer.

Configurer le canal

Une fois le canal créé, il est possible de modifier la configuration par défaut pour celui-ci. Bien sûr, l'utilisateur aura tout loisir de modifier celle-ci depuis les paramètres du système.

Voici quelques unes des possibilités :

  • enableLights() permet d'activer la LED lors d'une notification.
  • setLightColor() permet de configurer la couleur de la LED.
  • setSound() permet de personnaliser le son joué.
  • setVibrationPattern() permet de créer une vibration personnalisée.
  • LockScreenVisibility permet d'indiquer si les notifications sont visibles sur l'écran de verrouillage et si oui sous quelle forme (complète ou masquée pour ne pas afficher de données sensibles sur un écran vérouillé).
channel = new NotificationChannel(CHANNEL_ID, 
   channelName,
   NotificationImportance.High);
channel.EnableVibration(true);
channel.EnableLights(true);
channel.LockscreenVisibility = NotificationVisibility.Public;

Utiliser le canal

L'utilisation du canal est très simple : il suffit de spécifier son identifiant dans le constructeur du NotificationBuilder qui l'accepte comme deuxième paramètre.

NotificationCompat.Builder builder;
if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O)
{
 builder = new NotificationCompat.Builder(context, CHANNEL_ID);
} else
{
 builder = new NotificationCompat.Builder(context);
}

Et voilà, vos notifications apparaitront à nouveau sur votre Android ! D'ailleurs si vous voulez y ajouter des images distantes, lisez cet article :) !

69365f97-fb8f-4261-9eb0-f269f83df996_notifs.png

Happy coding :)

Photo de profil

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus