notifications example - NotificationCompat.Builder en desuso en Android O




studio deprecated (8)

Después de actualizar mi proyecto a Android O

buildToolsVersion "26.0.1"

Lint en Android Studio muestra una advertencia obsoleta para el siguiente método de creación de notificaciones:

new NotificationCompat.Builder(context)

El problema es: los Desarrolladores de Android actualizan su Documentación que describe NotificationChannel para admitir las notificaciones en Android O, y nos proporcionan un fragmento, pero con la misma advertencia en desuso:

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

Resumen de notificaciones

Mi pregunta: ¿Existe alguna otra solución para crear notificaciones y aún es compatible con Android O?

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

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

Answers

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

NotificationCompat.Builder(Context context, String channelId)

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

Este constructor está en desuso en el nivel de API 26.0.0-beta1. use NotificationCompat.Builder (Context, String) en su lugar. Todas las notificaciones publicadas deben especificar un Id. De NotificationChannel.

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

Este constructor está en desuso en el nivel de API 26. use Notification.Builder (Context, String) en su lugar Todas las notificaciones publicadas deben especificar un Id. De NotificationChannel.

Si desea reutilizar los creadores de constructores, puede crear el constructor con el ID de canal y pasar ese generador a un método auxiliar y establecer sus configuraciones preferidas en ese método.


Llame 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 anterior, el channelId se ignorará. Cuando se ejecuta en Android O, también cree un NotificationChannel con el mismo channelId .

Código de ejemplo desactualizado: el código de ejemplo en varias páginas JavaDoc, como https://developer.android.com/reference/android/app/Notification.Builder.html llama a new Notification.Builder(mContext) está desactualizado.

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

Clase en desuso : toda la clase v7 NotificationCompat.Builder está en desuso. (Consulte v7 NotificationCompat.Builder ). Anteriormente, se necesitaba v7 NotificationCompat.Builder para admitir NotificationCompat.MediaStyle . En Android O, hay un NotificationCompat.MediaStyle v4 en el paquete android.support.v4.media biblioteca de compatibilidad de medios . Use ese si necesita MediaStyle .

API 14+: en la biblioteca de soporte de 26.0.0 y superior, los paquetes support-v4 y support-v7 soportan un nivel de API mínimo de 14. Los nombres de v # son históricos.

Ver Revisiones recientes de la biblioteca de soporte .


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

Agregue la siguiente línea a la sección de la application del archivo AndroidManifest.xml como se explica en la aplicación Configurar una aplicación de cliente de mensajería en la nube de Firebase en el documento de Android :

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

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

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

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

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

    }

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

Aquí está el código de trabajo para todas las versiones de Android a partir de API LEVEL 26+ con compatibilidad con versiones anteriores.

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

ACTUALIZACIÓN 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());

Este constructor está 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 Id. De NotificationChannel.






android notifications android-notifications