it-swarm.com.ru

NotificationCompat.Builder устарел в Android O

После обновления моего проекта до Android O

buildToolsVersion "26.0.1"

Lint in Android Studio выводит устаревшее предупреждение для следующего метода построения уведомлений:

new NotificationCompat.Builder(context)

Проблема в том, что: Android Разработчики обновляют свою документацию с описанием NotificationChannel для поддержки уведомлений в Android O и предоставления нам фрагмента, но с тем же устаревшим предупреждением:

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

Обзор уведомлений

Мой вопрос: Есть ли какое-либо другое решение для создания уведомлений и все еще поддерживается Android O?

Я нашел решение передать идентификатор канала в качестве параметра в конструкторе Notification.Builder. Но это решение не является многоразовым.

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

В документации упоминается, что метод компоновщика NotificationCompat.Builder(Context context) устарел. И мы должны использовать конструктор, который имеет параметр channelId:

NotificationCompat.Builder(Context context, String channelId)

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

Этот конструктор устарел на уровне API 26.0.0-бета1. используйте взамен NotificationCompat.Builder (Context, String). Во всех опубликованных уведомлениях должен быть указан NotificationChannel Id.

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

Этот конструктор устарел на уровне API 26. Вместо этого используйте Notification.Builder (Context, String). Во всех опубликованных уведомлениях должен быть указан NotificationChannel Id.

Если вы хотите повторно использовать установщики компоновщика, вы можете создать компоновщик с помощью ChannelId, передать его в метод помощника и установить в нем предпочтительные настройки.

124
Bob

enter image description here

Вот рабочий код для всех Android версий по состоянию API LEVEL 26+ с обратной совместимостью.

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

ОБНОВЛЕНИЕ для API 26, чтобы установить максимальный приоритет

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

Вызовите 2-аргументный конструктор: Для совместимости с Android O вызовите support-v4 NotificationCompat.Builder(Context context, String channelId). При работе на Android N или более ранних версиях channelId будет игнорироваться. При работе на Android O также создайте NotificationChannel с тем же channelId.

Пример кода с устаревшей версией: Пример кода на нескольких страницах JavaDoc, например Notification.Builder вызов new Notification.Builder(mContext), устарел.

Устаревшие конструкторы: Notification.Builder(Context context) и v4 NotificationCompat.Builder(Context context) устарели в пользу Notification[Compat].Builder(Context context, String channelId). (См. Notification.Builder (Android.content.Context) и v4 NotificationCompat.Builder (Контекстный контекст) .)

Устаревший класс: Весь класс v7 NotificationCompat.Builder устарел. (См. v7 NotificationCompat.Builder .) Ранее для поддержки NotificationCompat.Builder был необходим v7 NotificationCompat.MediaStyle. В Android O в пакете media-compat libraryNotificationCompat.MediaStyle есть v4 Android.support.v4.media. Используйте это, если вам нужно MediaStyle.

API 14 +: В библиотеке поддержки от 26.0.0 и выше пакеты support-v4 и support-v7 поддерживают минимальный уровень API 14. Названия v # являются историческими.

См. Последние версии библиотеки поддержки .

27
Jerry101

Вместо проверки Build.VERSION.SDK_INT >= Build.VERSION_CODES.O, как предлагают многие ответы, есть несколько более простой способ -

Добавьте следующую строку в раздел application файла AndroidManifest.xml , как описано в Настройка клиентского приложения Firebase Cloud Messaging на Android Документ:

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

Затем добавьте строку с именем канала в файл values ​​/ strings.xml :

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

После этого вы сможете использовать новую версию конструктора NotificationCompat.Builder с 2 параметрами (поскольку старый конструктор с 1 параметром устарел в 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

Вот пример кода, который работает в Android Oreo и меньше, чем в 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

Простой образец

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

Правильный код будет:

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

с зависимостью 26.0.1 и новыми обновленными зависимостями, такими как 28.0.0.

Некоторые пользователи используют этот код в виде этого:

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

Таким образом, логика - это то, какой метод вы объявите или инициализируете, тогда тот же самый метод на правой стороне будет использоваться для распределения. если в Leftside of = вы будете использовать какой-либо метод, то тот же метод будет использоваться в правой части = для выделения с новым.

Попробуйте этот код ... Он обязательно будет работать

2
Pradeep Sheoran

Этот конструктор устарел на уровне API 26.1.0. используйте взамен NotificationCompat.Builder (Context, String). Во всех опубликованных уведомлениях должен быть указан NotificationChannel Id.

1
Sandeep Singh