NotificationCompat.Builder tidak lagi digunakan di Android O

161

Setelah memutakhirkan proyek saya ke Android O

buildToolsVersion "26.0.1"

Lint di Android Studio menunjukkan peringatan yang tidak berlaku untuk metode pembuat notifikasi ikuti:

new NotificationCompat.Builder(context)

Masalahnya adalah: Pengembang Android memperbarui Dokumentasi mereka yang menggambarkan NotificationChannel untuk mendukung notifikasi di Android O, dan memberi kami potongan, namun dengan peringatan usang yang sama:

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

Ikhtisar Pemberitahuan

Pertanyaan saya: Apakah ada solusi lain untuk membangun notifikasi, dan masih mendukung Android O?

Solusi yang saya temukan adalah untuk melewatkan ID saluran sebagai parameter dalam konstruktor Notification.Builder. Tetapi solusi ini tidak bisa digunakan kembali.

new Notification.Builder(MainActivity.this, "channel_id")
GuilhermeFGL
sumber
4
Tetapi solusi ini tidak bisa digunakan kembali. bagaimana?
Tim
5
NotificationCompat.Builder sudah tidak digunakan lagi, bukan Notification.Builder. Perhatikan bahwa bagian Compat hilang. Notifikasi adalah kelas baru mereka di mana mereka merampingkan segalanya
Kapil G
1
@ kapsym sebenarnya sebaliknya. Notification.Builder lebih tua
Tim
Ditambah lagi, saya tidak melihatnya ditinggalkan di sini developer.android.com/reference/android/support/v4/app/… . Mungkin bug di Lint
Kapil G
Id saluran dilewatkan di konstruktor, atau dapat ditempatkan menggunakan notificationBuild.setChannelId("channel_id"). Dalam kasus saya solusi terakhir ini lebih dapat digunakan kembali karena saya NotificationCompat.Builderdigunakan kembali dalam beberapa metode, menghemat parameter untuk ikon, suara dan bergetar.
GuilhermeFGL

Jawaban:

167

Disebutkan dalam dokumentasi bahwa metode pembangun NotificationCompat.Builder(Context context)telah ditinggalkan. Dan kita harus menggunakan konstruktor yang memiliki channelIdparameter:

NotificationCompat.Builder(Context context, String channelId)

Dokumentasi NotificationCompat.Builder:

Konstruktor ini tidak lagi digunakan dalam API level 26.0.0-beta1. gunakan NotificationCompat.Builder (Konteks, String) sebagai gantinya. Semua Notifikasi yang diposkan harus mencantumkan Id NotificationChannel.

Pemberitahuan. Dokumentasi Pembuat:

Konstruktor ini sudah tidak digunakan lagi di API level 26. sebagai gantinya gunakan Notification.Builder (Konteks, String). Semua Notifikasi yang diposkan harus mencantumkan Id NotificationChannel.

Jika Anda ingin menggunakan kembali seter builder, Anda bisa membuat builder dengan channelId, dan meneruskan builder itu ke metode helper dan mengatur pengaturan yang Anda inginkan dalam metode itu.

Bob
sumber
3
Tampaknya mereka bertentangan sendiri ketika memposting Notification.Builder(context)solusi di sesi NotificationChannel. Tapi yah, setidaknya Anda menemukan pos yang memberitahukan ini sudah usang =)
GuilhermeFGL
23
Apa channelId yang bisa Anda jelaskan?
Santanu Sur
15
Apa itu channelId?
RoundTwo
3
Anda juga masih dapat menggunakan NotificationCompat.Builder(Context context), dan kemudian menetapkan saluran seperti:builder.setChannelId(String channelId)
deyanm
36
Id saluran dapat berupa string apa pun, terlalu besar untuk dibahas dalam komentar, tetapi digunakan untuk memisahkan notifikasi Anda ke dalam kategori sehingga pengguna dapat menonaktifkan apa yang menurutnya tidak penting baginya daripada memblokir semua notifikasi dari aplikasi Anda.
yehyatt
110

masukkan deskripsi gambar di sini

Berikut adalah kode yang berfungsi untuk semua versi android pada API LEVEL 26+ dengan kompatibilitas ke belakang.

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

UPDATE untuk API 26 untuk menetapkan prioritas Max

    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());
Aks4125
sumber
Bagaimana Anda bisa membuat notifikasi benar-benar tampil di layar di aplikasi atau jika di aplikasi lain?
BlueBoy
@BlueBoy saya tidak mendapatkan pertanyaan Anda. dapatkah Anda menjelaskan apa yang sebenarnya Anda butuhkan?
Aks4125
@ Aks4125 Notifikasi tidak meluncur ke bawah dan muncul di bagian atas layar. Anda mendengar nada, dan ikon pemberitahuan kecil muncul di bilah status - tetapi tidak ada yang turun dan muncul seperti jika Anda mendapat pesan txt.
BlueBoy
@BlueBoy Anda perlu mengatur prioritas ke TINGGI untuk perilaku itu. beri tahu saya jika Anda membutuhkan saya untuk memperbarui kode ini. jika Anda menyelinap untuk pemberitahuan prioritas tinggi Anda akan mendapatkan jawaban Anda.
Aks4125
2
@Bueue memeriksa jawaban yang diperbarui. jika Anda tidak menargetkan 26 API maka gunakan saja kode yang sama dengan yang .setPriority(Notification.PRIORITY_MAX)lain gunakan kode yang diperbarui untuk 26 API. `
Aks4125
31

Panggil konstruktor 2-arg: Untuk kompatibilitas dengan Android O, panggil support-v4 NotificationCompat.Builder(Context context, String channelId). Saat berjalan di Android N atau sebelumnya, channelIdakan diabaikan. Saat berjalan di Android O, buat juga NotificationChanneldengan yang sama channelId.

Kode sampel kedaluwarsa: Kode sampel pada beberapa halaman JavaDoc seperti Notification.Builder calling new Notification.Builder(mContext)sudah kedaluwarsa.

Konstruktor usang :Notification.Builder(Context context) dan v4 NotificationCompat.Builder(Context context) tidak digunakan lagi Notification[Compat].Builder(Context context, String channelId). (Lihat Notification.Builder (android.content.Context) dan v4 NotificationCompat.Builder (Konteks konteks) .)

Kelas usang : Seluruh kelas v7 NotificationCompat.Builder sudah usang. (Lihat v7 NotificationCompat.Builder .) Sebelumnya, v7 NotificationCompat.Builderdiperlukan untuk mendukung NotificationCompat.MediaStyle. Di Android O, ada v4 NotificationCompat.MediaStyledi perpustakaan media-compat 's android.support.v4.mediapaket. Gunakan yang itu jika Anda perlu MediaStyle.

API 14+: Di Pustaka Dukungan mulai 26.0.0 dan lebih tinggi, paket support-v4 dan support-v7 keduanya mendukung tingkat API minimum 14. Nama v # adalah historis.

Lihat Revisi Perpustakaan Dukungan Terbaru .

Jerry101
sumber
22

Alih-alih memeriksa Build.VERSION.SDK_INT >= Build.VERSION_CODES.Osebanyak mungkin jawaban yang disarankan, ada cara yang sedikit lebih sederhana -

Tambahkan baris berikut ke applicationbagian file AndroidManifest.xml seperti yang dijelaskan dalam Aplikasi Menyiapkan Firebase Cloud Messaging Client Client di Android doc:

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

Kemudian tambahkan baris dengan nama saluran ke file nilai / strings.xml :

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

Setelah itu Anda akan dapat menggunakan versi baru NotificationCompat.Builder konstruktor dengan 2 parameter (karena konstruktor lama dengan 1 parameter telah ditinggalkan di 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());
}
Alexander Farber
sumber
1
bagaimana ini lebih sederhana? : S
Nactus
17

Berikut adalah contoh kode, yang berfungsi di Android Oreo dan kurang dari 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());
Arpit
sumber
8

Sampel sederhana

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

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

Kode yang benar adalah:

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

dengan dependensi 26.0.1 dan dependensi baru yang diperbarui seperti 28.0.0.

Beberapa pengguna menggunakan kode ini dalam bentuk ini:

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

Jadi Logika adalah apa yang Metode Anda akan mendeklarasikan atau initilize maka metode yang sama di sisi Kanan akan digunakan untuk Alokasi. jika di Leftside = Anda akan menggunakan beberapa metode maka metode yang sama akan digunakan di sisi kanan = untuk Alokasi dengan yang baru.

Coba kode ini ... Ini pasti akan berhasil

Pradeep Sheoran
sumber
1

Konstruktor ini sudah tidak digunakan lagi di API level 26.1.0. gunakan NotificationCompat.Builder (Konteks, String) sebagai gantinya. Semua Notifikasi yang diposkan harus mencantumkan Id NotificationChannel.

Sandeep Singh
sumber
Mungkin lebih suka menambahkan komentar dengan tautan ke dokumentasi alih-alih menyalin kucing dan memposting sebagai jawaban.
JacksOnF1re
0
  1. Perlu mendeklarasikan saluran Pemberitahuan dengan Notification_Channel_ID
  2. Buat pemberitahuan dengan ID saluran itu. Sebagai contoh,

...
 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());
...
Zaman
sumber