web-dev-qa-db-fra.com

NotificationCompat.Builder obsolète dans Android O

Après la mise à niveau de mon projet vers Android O

buildToolsVersion "26.0.1"

Lint dans Android Studio affiche un avertissement déconseillé pour la méthode du générateur de notifications suivante:

new NotificationCompat.Builder(context)

Le problème est le suivant: Android Les développeurs mettent à jour leur documentation en décrivant NotificationChannel pour prendre en charge les notifications dans Android O, et nous fournir un extrait, mais avec le même avertissement déconseillé:

Notification notification = new Notification.Builder(MainActivity.this)
        .setContentTitle("New Message")
        .setContentText("You've received new messages.")
        .setSmallIcon(R.drawable.ic_notify_status)
        .setChannelId(CHANNEL_ID)
        .build();  

Aperçu des notifications

Ma question: Existe-t-il une autre solution pour créer une notification tout en prenant en charge Android O?

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

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

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

NotificationCompat.Builder(Context context, String channelId)

https://developer.Android.com/reference/Android/support/v4/app/NotificationCompat.Builder.html

Ce constructeur était obsolète dans les API de niveau 26.0.0-beta1. utilisez plutôt NotificationCompat.Builder (Context, String). Toutes les notifications postées doivent spécifier un ID NotificationChannel.

https://developer.Android.com/reference/Android/app/Notification.Builder.html

Ce constructeur était obsolète dans l'API de niveau 26. Utilisez plutôt Notification.Builder (Context, String). Toutes les notifications postées doivent spécifier un ID NotificationChannel.

Si vous souhaitez réutiliser les paramètres de générateur, vous pouvez créer le générateur avec channelId, le transférer à une méthode d'assistance et définir vos paramètres préférés pour cette méthode.

132
Bob

enter image description here

Voici le code de travail pour toutes les versions de Android à partir de API NIVEAU 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) // this is deprecated in API 26 but you can still use for below 26. check below update for 26 API
                .setContentTitle("Default notification")
                .setContentText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
                .setContentInfo("Info");

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

UPDATE pour que l'API 26 définisse la priorité maximale

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

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

        // 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 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("Default notification")
            .setContentText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
            .setContentInfo("Info");

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

Appelez le constructeur à 2 arguments: Pour assurer la compatibilité avec Android O, appelez support-v4 NotificationCompat.Builder(Context context, String channelId). Lorsque vous utilisez Android N ou une version antérieure, le channelId sera ignoré. Lorsque vous utilisez Android O, créez également un NotificationChannel avec le même channelId.

Exemple de code obsolète: L'exemple de code figurant sur plusieurs pages JavaDoc, tel que Notification.Builder appelle new Notification.Builder(mContext) est périmé.

Constructeurs obsolètes: Notification.Builder(Context context) et v4 NotificationCompat.Builder(Context context) sont obsolètes en faveur de Notification[Compat].Builder(Context context, String channelId). (Voir Notification.Builder (Android.content.Context) et v4 NotificationCompat.Builder (Contexte contextuel) .)

Classe obsolète: Toute 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 package bibliothèque compatible avec les médias de Android.support.v4.media. Utilisez celui-là si vous avez besoin de MediaStyle.

API 14 +: Dans Support Library à partir de 26.0.0 et les versions ultérieures, les packages support-v4 et support-v7 prennent en charge un niveau API minimal de 14. Les noms v # sont historiques.

Voir Révisions récentes de la bibliothèque de support .

28
Jerry101

Au lieu de rechercher Build.VERSION.SDK_INT >= Build.VERSION_CODES.O comme le suggèrent de nombreuses réponses, il existe un moyen légèrement plus simple:

Ajoutez la ligne suivante à la section application du fichier AndroidManifest.xml , comme indiqué dans la section Configuration d’un client Firebase Cloud Messaging). App sur Android doc:

    <meta-data
        Android:name="com.google.firebase.messaging.default_notification_channel_id" 
        Android:value="@string/default_notification_channel_id" />

Ajoutez ensuite une ligne avec un nom de canal au fichier values ​​/ strings.xml :

<string name="default_notification_channel_id">default</string>

Après cela, vous pourrez utiliser la nouvelle version du constructeur NotificationCompat.Builder avec 2 paramètres (étant donné que l'ancien constructeur avec 1 paramètre est 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 /* Request code */,
            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());
}
19
Alexander Farber

Voici l'exemple de code qui fonctionne dans Android Oreo et inférieur à 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", "Name", 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());
14
Arpit

Échantillon simple

    public void showNotification (String from, String notification, Intent intent) {
        PendingIntent pendingIntent = PendingIntent.getActivity(
                context,
                Notification_ID,
                intent,
                PendingIntent.FLAG_UPDATE_CURRENT
        );


        String NOTIFICATION_CHANNEL_ID = "my_channel_id_01";
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.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(context, NOTIFICATION_CHANNEL_ID);
        Notification mNotification = builder
                .setContentTitle(from)
                .setContentText(notification)

//                .setTicker("Hearty365")
//                .setContentInfo("Info")
                //     .setPriority(Notification.PRIORITY_MAX)

                .setContentIntent(pendingIntent)

                .setAutoCancel(true)
//                .setDefaults(Notification.DEFAULT_ALL)
//                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.ic_launcher)
                .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
                .build();

        notificationManager.notify(/*notification id*/Notification_ID, mNotification);

    }
6
Mehul
Notification notification = new Notification.Builder(MainActivity.this)
        .setContentTitle("New Message")
        .setContentText("You've received new messages.")
        .setSmallIcon(R.drawable.ic_notify_status)
        .setChannelId(CHANNEL_ID)
        .build();  

Le bon code sera:

Notification.Builder notification=new Notification.Builder(this)

avec dépendance 26.0.1 et de nouvelles dépendances mises à jour telles que 28.0.0.

Certains utilisateurs utilisent ce code sous la forme suivante:

Notification notification=new NotificationCompat.Builder(this)//this is also wrong code.

Donc, la logique est la méthode que vous déclarerez ou initierez, puis la même méthode du côté droit sera utilisée pour l’allocation. si dans Leftside of = vous utiliserez une méthode, la même méthode sera utilisée dans le côté droit de = pour Allocation with new.

Essayez ce code ... ça va marcher

3
Pradeep Sheoran

Ce constructeur était obsolète dans l'API de niveau 26.1.0. utilisez plutôt NotificationCompat.Builder (Context, String). Toutes les notifications postées doivent spécifier un ID NotificationChannel.

1
Sandeep Singh