support - NotificationCompat.Builder en desuso en Android O




push notification android oreo (6)

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

    }

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 notificaciones en Android O, y nos proporcionan 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();  

Resumen de notificaciones

Mi pregunta: ¿hay alguna otra solución para crear 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")

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

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

Agrega la siguiente línea a la sección de application del archivo AndroidManifest.xml como se explica en la Configuración de una aplicación de cliente Firebase Cloud Messaging 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á utilizar 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());
}

Este constructor quedó 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 canal de notificación.


Llame al constructor de 2 argumentos: para compatibilidad con Android O, llame a support-v4 NotificationCompat.Builder(Context context, String channelId) . Cuando se ejecuta en Android N o anterior, se channelId el channelId . Cuando se ejecuta en Android O, también cree un NotificationChannel con el mismo channelId .

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

Los constructores obsoletos: Notification.Builder(Context context) y v4 NotificationCompat.Builder(Context context) están obsoletos a favor de Notification[Compat].Builder(Context context, String channelId) . (Consulte Notification.Builder(android.content.Context) y v4 NotificationCompat.Builder (Contexto contextual) .)

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 media-compat . 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 admiten un nivel mínimo de API de 14. Los nombres v # son históricos.

Ver revisiones recientes de la biblioteca de soporte .


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 el método que declarará o iniciará, luego se usará el mismo método en el lado derecho para la asignación. si en Leftside of = utilizará algún método, se utilizará el mismo método en el lado derecho de = para Asignación con nuevo.

Pruebe este código ... seguramente funcionará





android-notifications