web-dev-qa-db-fra.com

Les notifications ne s'affichent pas dans Android Oreo (API 26)

Je reçois ce message lorsque j'essaie d'afficher une notification sur Android O.

L'utilisation de types de flux est déconseillée pour des opérations autres que le contrôle du volume

La notification provient directement des exemples de documents et s'affiche correctement sous Android 25.

43
Sky Kelsey

Selon les commentaires sur cet article Google+ :

ces [avertissements] sont actuellement attendus lors de l'utilisation de NotificationCompat sur Android O périphériques (NotificationCompat appelle toujours setSound() même si vous ne transmettez jamais de son personnalisé).

jusqu'à ce que la bibliothèque de support modifie son code pour utiliser la version AudioAttributes de setSound, vous recevrez toujours cet avertissement.

Par conséquent, vous ne pouvez rien faire à propos de cet avertissement. Comme indiqué dans le guide des canaux de notification , Android O déconseille de définir un son dans une notification individuelle. Vous devez plutôt définir le son sur un canal de notification utilisé par toutes les notifications d'un message particulier. type.

60
ianhanniballake

À partir de Android O, vous devez configurer NotificationChannel , et référencer ce canal lorsque vous essayez d'afficher une notification.

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

Quelques notes importantes:

  1. Les paramètres tels que le modèle de vibration spécifié dans la variable NotificationChannel remplacent ceux spécifiés dans la variable Notification. Je sais, c'est contre-intuitif. Vous devez soit déplacer les paramètres qui vont changer dans la notification, soit utiliser un NotificationChannel différent pour chaque configuration.
  2. Vous ne pouvez pas modifier la plupart des paramètres NotificationChannel après les avoir passés à createNotificationChannel(). Vous ne pouvez même pas appeler deleteNotificationChannel() puis essayer de le rajouter. L'utilisation de l'ID d'un NotificationChannel supprimé le ressuscitera, et ce sera tout aussi immuable que lors de sa création. Il continuera à utiliser les anciens paramètres jusqu'à ce que l'application soit désinstallée. Vous feriez donc mieux de vous assurer des paramètres de votre chaîne et de réinstaller l'application si vous les manipulez pour qu'ils prennent effet.
44
Sky Kelsey

Tout ce que @ sky-kelsey a décrit est bon, Juste quelques ajouts mineurs :

Vous ne devez pas enregistrer le même canal à chaque fois s'il a déjà été enregistré, donc j'ai la méthode de la classe Utils qui crée un canal pour moi:

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>

Et j'appelle la méthode à chaque fois avant de montrer une notification du type:

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

Un autre problème typique - le son par défaut du canal - décrit ici: https://stackoverflow.com/a/45920861/2133585

8
Kirill Vashilo

Dans Android O, il est impératif d'utiliser une NotificationChannel et NotificationCompat.Builder est obsolète ( référence ).

Voici un exemple de code:

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());
2
Md Imran Choudhury