182 votes

<div>NotificationCompat.Builder obsolète dans Android O</div>

Après avoir mis à jour mon projet vers Android O

buildToolsVersion "26.0.1"

Lint dans Android Studio affiche un avertissement obsolète pour la méthode de création de notification suivante:

new NotificationCompat.Builder(context)

Le problème est: Les développeurs Android mettent à jour leur documentation en décrivant NotificationChannel pour prendre en charge les notifications dans Android O, et nous fournissent un extrait de code, pourtant avec le même avertissement obsolète:

Notification notification = new Notification.Builder(MainActivity.this)
        .setContentTitle("Nouveau message")
        .setContentText("Vous avez reçu de nouveaux messages.")
        .setSmallIcon(R.drawable.ic_notify_status)
        .setChannelId(CHANNEL_ID)
        .build();  

Aperçu des notifications

Ma question: Y a-t-il une autre solution pour créer des notifications et prendre en charge Android O?

Une solution que j'ai trouvée est de passer l'ID du canal en paramètre dans le constructeur de Notification.Builder. Mais cette solution n'est pas exactement réutilisable.

new Notification.Builder(MainActivity.this, "channel_id")

5 votes

Mais cette solution n'est pas exactement réutilisable. Comment cela ?

5 votes

NotificationCompat.Builder est obsolète, pas Notification.Builder. Remarquez que la partie Compat a disparu. Notification est leur nouvelle classe où ils rationalisent tout

2 votes

@kapsym c'est en fait le contraire. Notification.Builder est plus ancien

194voto

Dinesh Bob Points 1073

Il est mentionné dans la documentation que la méthode de construction NotificationCompat.Builder(Context context) a été dépréciée. Et nous devons utiliser le constructeur qui a le paramètre channelId:

NotificationCompat.Builder(Context context, String channelId)

Documentation de NotificationCompat.Builder:

Ce constructeur a été déprécié dans la version API 26.0.0-beta1. Utilisez NotificationCompat.Builder(Context, String) à la place. Toutes les Notifications postées doivent spécifier un Id de NotificationChannel.

Documentation de Notification.Builder:

Ce constructeur a été déprécié dans la version API 26. Utilisez Notification.Builder(Context, String) à la place. Toutes les Notifications postées doivent spécifier un Id de NotificationChannel.

Si vous souhaitez réutiliser les setters du builder, vous pouvez créer le builder avec le channelId, et passer ce builder à une méthode d'aide et définir vos paramètres préférés dans cette méthode.

4 votes

Il semble qu'ils se contredisent en publiant la solution Notification.Builder(context) dans la session NotificationChannel. Mais bon, au moins vous avez trouvé un message notifiant cette obsolescence =)

28 votes

Quel est le channelId pouvez-vous s'il vous plaît expliquer ?

20 votes

Qu'est-ce que channelId ?

121voto

Aks4125 Points 2326

entrer la description de l'image ici

Voici le code de travail pour toutes les versions d'Android à partir de API LEVEL 26+ avec compatibilité ascendante.

 NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getContext(), "M_CH_ID");

        notificationBuilder.setAutoCancel(true)
                .setDefaults(Notification.DEFAULT_ALL)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.drawable.ic_launcher)
                .setTicker("Hearty365")
                .setPriority(Notification.PRIORITY_MAX) // ceci est obsolète en API 26 mais vous pouvez toujours l'utiliser pour les versions inférieures à 26. vérifiez la mise à jour ci-dessous pour l'API 26
                .setContentTitle("Notification par défaut")
                .setContentText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
                .setContentInfo("Info");

NotificationManager notificationManager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(1, notificationBuilder.build());

MISE A JOUR pour l'API 26 pour définir la priorité maximale

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    String NOTIFICATION_CHANNEL_ID = "mon_id_de_canal_01";

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "Mes notifications", NotificationManager.IMPORTANCE_MAX);

        // Configurez le canal de notification.
        notificationChannel.setDescription("Description du canal");
        notificationChannel.enableLights(true);
        notificationChannel.setLightColor(Color.RED);
        notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
        notificationChannel.enableVibration(true);
        notificationManager.createNotificationChannel(notificationChannel);
    }

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);

    notificationBuilder.setAutoCancel(true)
            .setDefaults(Notification.DEFAULT_ALL)
            .setWhen(System.currentTimeMillis())
            .setSmallIcon(R.drawable.ic_launcher)
            .setTicker("Hearty365")
       //     .setPriority(Notification.PRIORITY_MAX)
            .setContentTitle("Notification par défaut")
            .setContentText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
            .setContentInfo("Info");

    notificationManager.notify(/*id de notification*/1, notificationBuilder.build());

0 votes

Comment pouvez-vous faire en sorte que la notification s'affiche réellement sur l'écran dans l'application ou dans une autre application ?

0 votes

@BlueBoy je ne comprends pas ta question. Pourrais-tu expliquer exactement ce dont tu as besoin ?

0 votes

@Aks4125 La notification ne glisse pas vers le bas et n'apparaît pas en haut de l'écran. Vous entendez un son et une petite icône de notification apparaît dans la barre d'état - mais rien ne glisse et ne s'affiche comme si vous aviez reçu un message texte.

32voto

Jerry101 Points 2658

Appeler le constructeur 2-arg : Pour la compatibilité avec Android O, appeler le NotificationCompat.Builder(Context context, String channelId) de support-v4. Lors de l'exécution sur Android N ou antérieur, le channelId sera ignoré. Lors de l'exécution sur Android O, créez également un NotificationChannel avec le même channelId.

Code d'exemple obsolète : Le code d'exemple sur plusieurs pages JavaDoc telles que Notification.Builder appelant new Notification.Builder(mContext) est obsolète.

Constructeurs obsolètes : Notification.Builder(Context context) et v4 NotificationCompat.Builder(Context context) sont obsolètes au profit de Notification[Compat].Builder(Context context, String channelId). (Voir Notification.Builder(android.content.Context) et v4 NotificationCompat.Builder(Context context).)

Classe obsolète : L'ensemble de la classe v7 NotificationCompat.Builder est obsolète. (Voir v7 NotificationCompat.Builder.) Auparavant, v7 NotificationCompat.Builder était nécessaire pour prendre en charge NotificationCompat.MediaStyle. Dans Android O, il existe un v4 NotificationCompat.MediaStyle dans le bibliothèque media-compat du package android.support.v4.media. Utilisez celui-ci si vous avez besoin de MediaStyle.

API 14+ : Dans la bibliothèque de support à partir de 26.0.0 et ultérieure, les packages support-v4 et support-v7 prennent en charge un niveau API minimum de 14. Les noms v# sont historiques.

Voir Récentes Révisions de la Bibliothèque de Support.

24voto

Alexander Farber Points 1434

Au lieu de vérifier Build.VERSION.SDK_INT >= Build.VERSION_CODES.O comme le suggèrent de nombreuses réponses, il y a une façon légèrement plus simple -

Ajoutez la ligne suivante à la section application du fichier AndroidManifest.xml comme expliqué dans la documentation Configurer une application cliente Firebase Cloud Messaging sur Android:

Ensuite, ajoutez une ligne avec un nom de canal dans le fichier values/strings.xml:

default

Après cela, vous pourrez utiliser la nouvelle version du constructeur de NotificationCompat.Builder avec 2 paramètres (car l'ancien constructeur avec 1 paramètre a été obsolète dans Android Oreo):

private void sendNotification(String title, String body) {
    Intent i = new Intent(this, MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pi = PendingIntent.getActivity(this,
            0 /* Code de requête */,
            i,
            PendingIntent.FLAG_ONE_SHOT);

    Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this, 
        getString(R.string.default_notification_channel_id))
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(title)
            .setContentText(body)
            .setAutoCancel(true)
            .setSound(sound)
            .setContentIntent(pi);

    NotificationManager manager = 
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    manager.notify(0, builder.build());
}

1 votes

Comment est-ce plus simple? :S

0 votes

Je DÉTESTE les déclarations conditionnelles de la version SDK. Donc je veux essayer ce 'developer.android.google.cn/reference/androidx/core/app/…', mais je ne peux pas l'importer. Comment résoudre? Merci.

21voto

Arpit Points 879

Voici le code d'exemple, qui fonctionne sur Android Oreo et sur des versions antérieures à Oreo.

  NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            NotificationCompat.Builder builder = null;
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                int importance = NotificationManager.IMPORTANCE_DEFAULT;
                NotificationChannel notificationChannel = new NotificationChannel("ID", "Nom", importance);
                notificationManager.createNotificationChannel(notificationChannel);
                builder = new NotificationCompat.Builder(getApplicationContext(), notificationChannel.getId());
            } else {
                builder = new NotificationCompat.Builder(getApplicationContext());
            }

            builder = builder
                    .setSmallIcon(R.drawable.ic_notification_icon)
                    .setColor(ContextCompat.getColor(context, R.color.color))
                    .setContentTitle(context.getString(R.string.getTitel))
                    .setTicker(context.getString(R.string.text))
                    .setContentText(message)
                    .setDefaults(Notification.DEFAULT_ALL)
                    .setAutoCancel(true);
            notificationManager.notify(requestCode, builder.build());

0 votes

NotificationCompat est utilisé pour résoudre le problème de compatibilité. Mais votre solution utilise toujours une déclaration conditionnelle de version SDK. Je suppose qu'il existe peut-être une meilleure solution.

0 votes

Cette méthode a fonctionné pour moi (en utilisant Xamarin), alors que celle d'Alexander Farber n'a pas fonctionné : cela marchait sur Nougat mais pas sur Oreo

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X