Pregunta NotificationCompat.Builder desaprobado en Android O


Después de actualizar mi proyecto a Android O

buildToolsVersion "26.0.1"

Lint en Android Studio muestra una advertencia obsoleta para el método del generador de notificaciones de seguimiento:

new NotificationCompat.Builder(context)

El problema es: Los desarrolladores de Android actualizan su documentación describiendo NotificationChannel para admitir notificaciones en Android O y proporcionarnos un fragmento, pero con la misma advertencia obsoleta:

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

Descripción de las notificaciones

Mi pregunta: ¿Hay alguna otra solución para generar notificaciones, y todavía es compatible con Android O?

Una solución que encontré es pasar el ID del canal como parámetro en el constructor Notification.Builder. Pero esta solución no es exactamente reutilizable.

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

75
2017-08-02 13:44


origen


Respuestas:


Se menciona en la documentación que el método de construcción NotificationCompat.Builder(Context context) ha sido desaprobado. Y tenemos que usar el constructor que tiene el channelId parámetro:

NotificationCompat.Builder(Context context, String channelId)

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

Este constructor estaba en desuso en el nivel de API 26.0.0-beta1. utilizar   NotificationCompat.Builder (Context, String) en su lugar. Todos publicados   Las notificaciones deben especificar un NotificationChannel Id.

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

Este constructor estaba en desuso en el nivel 26 de la API.   Notification.Builder (Context, String) en su lugar. Todos publicados   Las notificaciones deben especificar un NotificationChannel Id.

Si desea reutilizar los adaptadores del constructor, puede crear el constructor con el identificador de canal, pasar el constructor a un método auxiliar y establecer su configuración preferida en ese método.


63
2017-08-02 15:52



Aquí está el código de trabajo para todas las versiones de Android a partir de NIVEL DE API 26+ con compatibilidad hacia atrás.

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

ACTUALIZAR para API 26 para establecer la prioridad máxima

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

55
2017-11-15 09:32



Llamar al constructor 2-arg: Para compatibilidad con Android O, llame a support-v4 NotificationCompat.Builder(Context context, String channelId). Cuando se ejecuta en Android N o antes, el channelId será ignorado Cuando se ejecuta en Android O, también crea un NotificationChannel con el mismo channelId.

Código de muestra desactualizado: El código de muestra en varias páginas JavaDoc, como Notification.Builder vocación new Notification.Builder(mContext) esta fuera de fecha.

Constructores en desuso:  Notification.Builder(Context context) y v4  NotificationCompat.Builder(Context context) están en desuso a favor de Notification[Compat].Builder(Context context, String channelId). (Ver Notification.Builder (android.content.Context) y v4 NotificationCompat.Builder (Contexto contextual).)

Clase obsoleta: Toda la clase v7  NotificationCompat.Builder es obsoleto. (Ver v7 NotificationCompat.Builder.) Anteriormente, v7 NotificationCompat.Builder fue necesario para apoyar NotificationCompat.MediaStyle. En Android O, hay un v4 NotificationCompat.MediaStyle en el biblioteca de medios compatibleses android.support.v4.media paquete. Usa ese si necesitas MediaStyle.

API 14+: En Support Library desde 26.0.0 y superior, los paquetes support-v4 y support-v7 admiten un nivel mínimo de API de 14. Los nombres v # son históricos.

Ver Revisiones recientes de la biblioteca de soporte.


20
2017-08-09 01:15



En lugar de buscar Build.VERSION.SDK_INT >= Build.VERSION_CODES.O como muchas respuestas sugieren, hay una manera un poco más simple:

Agregue la siguiente línea al application Sección de AndroidManifest.xml archivo como se explica en el Configurar una aplicación Firebase Cloud Messaging Client en Android doc:

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

A continuación, agregue una línea con un nombre de canal al values ​​/ strings.xml archivo:

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

Después de eso, podrás usar la nueva versión de NotificationCompat.Builder constructor con 2 parámetros (ya que el antiguo constructor con 1 parámetro ha sido desaprobado en 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());
}

13
2017-11-22 15:27



Aquí está el código de muestra, que funciona en Android Oreo y menos que 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());

8
2017-11-16 10:13



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

    }

4
2018-01-30 12:32



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

El código correcto será:

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

con dependencia 26.0.1 y nuevas dependencias actualizadas como 28.0.0.

Algunos usuarios usan este código en la forma de esto:

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

Entonces la Lógica es aquel Método que usted declarará o iniciará, entonces se usará el mismo método en el lado Derecho para la Asignación. si en Lefter de = usará algún método, entonces se usará el mismo método en el lado derecho de = para Asignación con nuevo.

Prueba este código ... Seguro que funcionará


2
2018-05-26 13:56



Este constructor estaba en desuso en el nivel de API 26.1.0. use NotificationCompat.Builder (Context, String) en su lugar. Todas las notificaciones publicadas deben especificar un NotificationChannel Id.


1
2018-05-04 06:38