NotificationCompat.Builder, Android O'da kullanımdan kaldırıldı


161

Projemi Android O'ya yükselttikten sonra

buildToolsVersion "26.0.1"

Android Studio'daki Lint, aşağıdaki bildirim oluşturucu yöntemi için kullanımdan kaldırılmış bir uyarı gösteriyor:

new NotificationCompat.Builder(context)

Sorun şudur: Android Geliştiricileri , Android O'daki bildirimleri desteklemek için NotificationChannel'i açıklayan Dokümanlarını günceller ve bize aynı pasaj uyarısıyla birlikte bir snippet sağlar:

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

Bildirimlere Genel Bakış

Benim sorum: Bildirim oluşturmak için başka bir çözüm var mı ve hala Android O'yu destekliyor musunuz?

Bulduğum bir çözüm, kanal kimliğini Notification.Builder yapıcısında parametre olarak iletmektir. Ancak bu çözüm tam olarak tekrar kullanılamaz.

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

4
Ancak bu çözüm tam olarak tekrar kullanılamaz. nasıl yani?
Tim

5
NotificationCompat.Builder, Notification.Builder tarafından kullanımdan kaldırılmıştır. Compat kısmının gittiğine dikkat edin. Bildirim, her şeyi düzene koydukları yeni sınıflarıdır
Kapil G

1
@kapsym aslında tam tersi. Builder daha eski
Tim

Ayrıca burada geliştirici görmüyorum geliştirici.android.com/ reference/android/support/v4/app/… . Belki Lint'te bir böcek
Kapil G

Kanal kimliği yapıcıya iletilir veya kullanılarak yerleştirilebilir notificationBuild.setChannelId("channel_id"). Benim durumumda bu son çözüm daha çok yeniden kullanılabilir, çünkü benim NotificationCompat.Builderiçin birkaç yöntemle yeniden kullanıldı, simgeler, sesler ve titreşimler için parametreler kaydedildi.
GuilhermeFGL

Yanıtlar:


167

Belgelerde oluşturucu yönteminin NotificationCompat.Builder(Context context)kullanımdan kaldırıldığı belirtilmektedir. Ve şu channelIdparametreye sahip yapıcıyı kullanmak zorundayız :

NotificationCompat.Builder(Context context, String channelId)

BildirimKarşılaştırıcı Belgeleri:

Bu kurucu API seviyesi 26.0.0-beta1'de kullanımdan kaldırıldı. bunun yerine NotificationCompat.Builder (Context, String) kullanın. Gönderilen tüm Bildirimler bir NotificationChannel Kimliği belirtmelidir.

Bildirim Belgeleri:

Bu kurucu API 26 düzeyinde kullanımdan kaldırıldı. Bunun yerine Notification.Builder (Context, String) kullanın. Gönderilen tüm Bildirimler bir NotificationChannel Kimliği belirtmelidir.

Oluşturucu ayarlayıcılarını yeniden kullanmak isterseniz, oluşturucuyu ile oluşturabilir channelIdve bu oluşturucuyu bir yardımcı yönteme aktarabilir ve tercih ettiğiniz ayarları bu yöntemde ayarlayabilirsiniz.


3
Notification.Builder(context)NotificationChannel oturumunda çözüm gönderirken kendileriyle çelişiyor gibi görünüyor . Ama en azından, bu saygısızlığı bildiren bir mesaj buldunuz =)
GuilhermeFGL

23
Kanal açıklaması nedir?
Santanu Sur

15
channelId nedir?
Yuvarlakİki

3
Yine de kullanabilir NotificationCompat.Builder(Context context)ve ardından kanalı şöyle atayabilirsiniz:builder.setChannelId(String channelId)
deyanm

36
Bir kanal kimliği herhangi bir dize olabilir, yorumlarda tartışmak çok büyüktür, ancak bildirimlerinizi kategorilere ayırmak için kullanılır, böylece kullanıcı, uygulamanızdan tüm bildirimleri engellemek yerine onun için önemli olmadığını düşündüğü şeyi devre dışı bırakabilir.
yehyatt

110

resim açıklamasını buraya girin

İşte tüm android sürümleri için çalışma kodu geriye dönük uyumluluk ile 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());

Maksimum önceliği ayarlamak için API 26 için GÜNCELLEME

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

Bildirimin uygulamadaki ekranda veya başka bir uygulamada gerçekte nasıl gösterilmesini sağlayabilirsiniz?
BlueBoy

@MaviBoy sorunuzu almıyorum. Tam olarak neye ihtiyacınız olduğunu açıklar mısınız?
Aks4125

@ Aks4125 Bildirim aşağı kaymaz ve ekranın üst kısmında gösterilmez. Bir ses duyarsınız ve durum çubuğunda küçük bir bildirim simgesi görünür - ancak hiçbir şey aşağı kaymaz ve bir txt mesajınız varmış gibi görünmez.
BlueBoy

@BlueBoy, bu davranış için önceliği YÜKSEK olarak ayarlamanız gerekir. bu kodu güncellemem gerekiyorsa bana bildirin. Yüksek öncelikli bildirim için gizlice girerseniz, yanıtınızı alırsınız.
Aks4125

2
@ BlueBoy güncellenmiş cevabı kontrol edin. 26 API'yi hedeflemiyorsanız, yalnızca .setPriority(Notification.PRIORITY_MAX)26 API için güncellenmiş kodu kullanın ile aynı kodu kullanın. `
Aks4125

31

2-arg yapıcısını arayın: Android O ile uyumluluk için support-v4'ü arayın NotificationCompat.Builder(Context context, String channelId). Android N veya daha eski sürümlerde çalışırken channelIdyok sayılır. Android O çalışırken, aynı zamanda bir oluşturmak NotificationChannelaynı olan channelId.

Güncel olmayan örnek kod: Notification.Builder gibi birkaç JavaDoc sayfasındaki örnek kod aramasınew Notification.Builder(mContext) güncel değil.

Kullanımdan kaldırılmış kurucular:Notification.Builder(Context context) ve v4 NotificationCompat.Builder(Context context) lehine kullanımdan kaldırıldı Notification[Compat].Builder(Context context, String channelId). (Bkz. Notification.Builder (android.content.Context) ve v4 NotificationCompat.Builder (Bağlam içeriği) .)

Kullanımdan kaldırılmış sınıf: Tüm sınıf NotificationCompat.Builder kaldırılmış v7 kullanımdan kaldırılmıştır. (Bkz. V7 NotificationCompat.Builder .) Daha NotificationCompat.Builderönce desteklemek için v7 gerekiyordu NotificationCompat.MediaStyle. Android O ise, bir v4 var NotificationCompat.MediaStyleiçinde medya compat kütüphane 'ın android.support.v4.mediapaketine. İhtiyacınız olursa kullanın MediaStyle.

API 14+: 26.0.0 ve sonraki sürümlerden itibaren Destek Kitaplığı'nda support-v4 ve support-v7 paketlerinin her ikisi de minimum 14 API düzeyini destekler. V # adları geçmişte kalır.

Bkz. Son Destek Kitaplığı Revizyonları .


22

Kontrol etmek yerine Build.VERSION.SDK_INT >= Build.VERSION_CODES.OBirçok cevabın önerdiğini biraz daha basit bir yol var -

Android doc üzerinde Firebase Cloud Messaging Client App Kurmaapplication bölümünde açıklandığı gibi AndroidManifest.xml dosyasının bölümüne aşağıdaki satırı ekleyin :

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

Ardından, değerler / strings.xml dosyasına kanal adıyla bir satır ekleyin :

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

Bundan sonra NotificationCompat.Builder yapıcısının yeni sürümünü 2 parametreli kullanabileceksiniz (1 parametreli eski yapıcı Android Oreo'da kullanımdan kaldırıldığından):

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

1
bu nasıl daha basit? : S
Nactus

17

İşte Android Oreo'da çalışan ve Oreo'dan daha az olan örnek kod.

  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

Basit Örnek

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

Doğru kod:

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

bağımlılığı 26.0.1 ve yeni güncellenmiş bağımlılıkları olan 28.0.0.

Bazı kullanıcılar bu kodu şu şekilde kullanır:

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

Bu yüzden Mantık, Sağ taraftaki aynı metodu beyan edeceğiniz veya başlatacağınız Tahsis için kullanılacak yöntemdir. Eğer Leftside'da = bir yöntem kullanacaksanız, aynı yöntem = Yeni ile Tahsis için sağ tarafta kullanılır.

Bu kodu deneyin ...


1

Bu kurucu API seviyesi 26.1.0'da kullanımdan kaldırıldı. bunun yerine NotificationCompat.Builder (Context, String) kullanın. Gönderilen tüm Bildirimler bir NotificationChannel Kimliği belirtmelidir.


Belki de kopya kedi ve cevap olarak göndermek yerine belgelere bağlantı içeren bir yorum ekleyin.
JacksOnF1re

0
  1. Notification_Channel_ID ile bir Bildirim kanalı bildirmeniz gerekiyor
  2. Bu kanal kimliğiyle bildirim oluşturun. Örneğin,

...
 public static final String NOTIFICATION_CHANNEL_ID = MyLocationService.class.getSimpleName();
...
...
NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID,
                NOTIFICATION_CHANNEL_ID+"_name",
                NotificationManager.IMPORTANCE_HIGH);

NotificationManager notifManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

notifManager.createNotificationChannel(channel);


NotificationCompat.Builder builder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
                .setContentTitle(getString(R.string.app_name))
                .setContentText(getString(R.string.notification_text))
                .setOngoing(true)
                .setContentIntent(broadcastIntent)
                .setSmallIcon(R.drawable.ic_tracker)
                .setPriority(PRIORITY_HIGH)
                .setCategory(Notification.CATEGORY_SERVICE);

        startForeground(1, builder.build());
...
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.