Pertanyaan NotificationCompat.Builder tidak lagi digunakan di Android O


Setelah meningkatkan proyek saya menjadi Android O

buildToolsVersion "26.0.1"

Lint di Android Studio menunjukkan peringatan yang tidak berlaku lagi untuk metode pembuat pemberitahuan berikut:

new NotificationCompat.Builder(context)

Masalahnya adalah: Pengembang Android memperbarui penjelasan Dokumentasi mereka NotificationChannel untuk mendukung pemberitahuan di Android O, dan memberikan kami cuplikan, namun dengan peringatan yang tidak berlaku lagi:

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 Notifikasi

Pertanyaan saya: Apakah ada solusi lain untuk pemberitahuan bangunan, dan masih mendukung Android O?

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

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

75
2017-08-02 13:44


asal


Jawaban:


Disebutkan dalam dokumentasi bahwa metode builder NotificationCompat.Builder(Context context) sudah tidak digunakan lagi. Dan kita harus menggunakan konstruktor yang memiliki channelId parameter:

NotificationCompat.Builder(Context context, String channelId)

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

Konstruktor ini tidak lagi digunakan di API level 26.0.0-beta1. menggunakan   NotificationCompat.Builder (Konteks, String) sebagai gantinya. Semua diposting   Notifikasi harus menentukan Id NotificationChannel.

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

Konstruktor ini sudah ditinggalkan di API level 26. digunakan   Notification.Builder (Konteks, String) sebagai gantinya. Semua diposting   Notifikasi harus menentukan Id NotificationChannel.

Jika Anda ingin menggunakan kembali pembuat setter, Anda dapat membuat pembuat dengan saluranId, dan meneruskan pembangun itu ke metode pembantu dan menetapkan pengaturan yang Anda sukai dalam metode itu.


63
2017-08-02 15:52



Kode di sini 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());

PERBARUI untuk API 26 untuk mengatur prioritas Maks

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

55
2017-11-15 09:32



Hubungi konstruktor 2-arg: Untuk kompatibilitas dengan Android O, hubungi dukungan-v4 NotificationCompat.Builder(Context context, String channelId). Saat berjalan di Android N atau sebelumnya, channelId akan diabaikan. Saat berjalan di Android O, buat juga NotificationChannel dengan yang sama channelId.

Kode contoh kedaluwarsa: Kode contoh pada beberapa halaman JavaDoc seperti Notification.Builder panggilan new Notification.Builder(mContext) sudah ketinggalan zaman.

Kontraktor yang tidak berlaku lagi:  Notification.Builder(Context context) dan v4  NotificationCompat.Builder(Context context) tidak lagi mendukung Notification[Compat].Builder(Context context, String channelId). (Lihat Notification.Builder (android.content.Context) dan v4 NotificationCompat.Builder (Konteks konteks).)

Kelas tidak berlaku lagi: Seluruh kelas v7  NotificationCompat.Builder sudah ditinggalkan. (Lihat v7 NotificationCompat.Builder.) Sebelumnya, v7 NotificationCompat.Builder diperlukan untuk mendukung NotificationCompat.MediaStyle. Di Android O, ada v4 NotificationCompat.MediaStyle dalam perpustakaan media-compat's android.support.v4.media paket. Gunakan itu jika Anda membutuhkannya MediaStyle.

API 14+: Di Support Library dari 26.0.0 dan lebih tinggi, paket support-v4 dan support-v7 keduanya mendukung level API minimum 14. Nama-nama v # adalah historis.

Lihat Revisi Perpustakaan Dukungan Baru-Baru Ini.


20
2017-08-09 01:15



Daripada memeriksa Build.VERSION.SDK_INT >= Build.VERSION_CODES.O sebanyak mungkin jawaban, ada cara yang lebih sederhana -

Tambahkan baris berikut ke application bagian dari AndroidManifest.xml file seperti yang dijelaskan di Menyiapkan Aplikasi Klien Firebase Cloud Messaging di Android dokter:

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

Kemudian tambahkan garis dengan nama saluran ke nilai / strings.xml mengajukan:

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

13
2017-11-22 15:27



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

8
2017-11-16 10:13



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

    }

4
2018-01-30 12:32



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 kanan adalah:

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

dengan ketergantungan 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 Logic adalah Metode mana yang akan Anda deklarasikan atau initilisasi, maka metode yang sama di sisi Kanan akan digunakan untuk Alokasi. jika dalam Leftside of = Anda akan menggunakan beberapa metode maka metode yang sama akan digunakan di sisi kanan = untuk Alokasi dengan yang baru.

Coba kode ini ... Pasti akan berfungsi


2
2018-05-26 13:56



Konstruktor ini tidak lagi digunakan di API level 26.1.0. gunakan NotificationCompat.Builder (Context, String) sebagai gantinya. Semua Pemberitahuan yang diposting harus menentukan Id NotificationChannel.


1
2018-05-04 06:38