NotificationCompat.Builder เลิกใช้แล้วใน Android O


161

หลังจากอัปเกรดโครงการเป็นAndroid O

buildToolsVersion "26.0.1"

ผ้าสำลีใน 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 หรือไม่

วิธีแก้ปัญหาที่ฉันพบคือส่งรหัสช่องสัญญาณเป็นพารามิเตอร์ใน แต่วิธีนี้ไม่สามารถใช้ซ้ำได้อย่างแน่นอน

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

4
แต่วิธีนี้ไม่สามารถใช้ซ้ำได้อย่างแน่นอน งั้นเหรอ
ทิม

5
NotificationCompat.Builder เลิกใช้แล้วไม่ใช่ Notification.Builder สังเกตุส่วนที่เข้ากันได้หายไป การแจ้งเตือนเป็นชั้นเรียนใหม่ของพวกเขาที่พวกเขากำลังปรับปรุงทุกอย่าง
Kapil G

1
@kapsym มันเป็นวิธีอื่นในความเป็นจริง Notification.Builder เก่ากว่า
Tim

พลัสฉันไม่เห็นมันเลิกนี่developer.android.com/reference/android/support/v4/app/... อาจเป็นข้อผิดพลาดใน Lint
Kapil G

id notificationBuild.setChannelId("channel_id")ของช่องทางผ่านที่สร้างหรือสามารถวางใช้ ในกรณีของฉันการแก้ปัญหาครั้งสุดท้ายนี้สามารถนำมาใช้ใหม่ได้มากขึ้นเนื่องจากฉันNotificationCompat.Builderสามารถนำกลับมาใช้ใหม่ในสองสามวิธีประหยัดค่าพารามิเตอร์สำหรับไอคอนเสียงและการสั่นสะเทือน
GuilhermeFGL

คำตอบ:


167

มันถูกกล่าวถึงในเอกสารที่ว่าวิธีการสร้างNotificationCompat.Builder(Context context)ได้รับการคัดค้าน และเราต้องใช้ตัวสร้างซึ่งมีchannelIdพารามิเตอร์:

NotificationCompat.Builder(Context context, String channelId)

NotificationCompat เอกสารคู่มือผู้สร้าง:

ตัวสร้างนี้เลิกใช้แล้วใน API ระดับ 26.0.0-beta1 ใช้ NotificationCompat.Builder (บริบทสตริง) แทน การแจ้งเตือนที่โพสต์ทั้งหมดต้องระบุรหัส NotificationChannel

เอกสารคู่มือผู้สร้าง:

คอนสตรัคนี้เลิกใช้ใน API ระดับ 26 ให้ใช้ Notification.Builder (บริบทสตริง) แทน การแจ้งเตือนที่โพสต์ทั้งหมดต้องระบุรหัส NotificationChannel

หากคุณต้องการใช้ setters ผู้สร้างซ้ำคุณสามารถสร้างตัวสร้างด้วยchannelIdและส่งตัวสร้างนั้นไปยังวิธีช่วยเหลือและตั้งค่าที่คุณต้องการในวิธีนั้น


3
ดูเหมือนว่าพวกเขาขัดแย้งกับตัวเองเมื่อโพสต์Notification.Builder(context)โซลูชันในเซสชัน NotificationChannel แต่อย่างน้อยคุณก็พบว่ามีโพสต์แจ้งว่าการเลิกใช้ =)
GuilhermeFGL

23
โปรดอธิบายช่องทางที่คุณต้องการคืออะไร
Santanu Sur

15
channelId คืออะไร
รอบสอง

3
คุณยังสามารถใช้งานได้NotificationCompat.Builder(Context context)จากนั้นกำหนดช่องดังนี้:builder.setChannelId(String channelId)
deyanm

36
รหัสแชแนลอาจเป็นสตริงใด ๆ มันใหญ่เกินไปที่จะพูดคุยในความคิดเห็น แต่ใช้เพื่อแยกการแจ้งเตือนของคุณออกเป็นหมวดหมู่เพื่อให้ผู้ใช้สามารถปิดการใช้งานสิ่งที่เขาคิดว่าไม่สำคัญสำหรับเขาแทนที่จะปิดกั้นการแจ้งเตือนทั้งหมดจากแอปของคุณ
yehyatt

110

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือโค้ดที่ใช้งานได้สำหรับ 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());

คุณจะทำให้การแจ้งเตือนแสดงบนหน้าจอจริงในแอพหรือในแอพอื่นได้อย่างไร?
BlueBoy

@ BlueBoy ฉันไม่ได้รับคำถามของคุณ คุณช่วยอธิบายสิ่งที่คุณต้องการได้อย่างแน่นอน?
Aks4125

@ Aks4125 การแจ้งเตือนไม่เลื่อนลงมาและแสดงที่ด้านบนของหน้าจอ คุณได้ยินเสียงและไอคอนแจ้งเตือนเล็ก ๆ ปรากฏขึ้นในแถบสถานะ - แต่ไม่มีอะไรเลื่อนลงมาและแสดงให้เห็นว่าถ้าคุณได้รับข้อความ txt
BlueBoy

@BlueBoy คุณต้องกำหนดระดับความสำคัญเป็น HIGH สำหรับลักษณะการทำงานนั้น แจ้งให้เราทราบหากคุณต้องการให้ฉันอัปเดตรหัสนี้ หากคุณแอบไปรอบ ๆ เพื่อรับการแจ้งเตือนที่มีลำดับความสำคัญสูงคุณจะได้รับคำตอบของคุณ
Aks4125

2
@BlueBoy ตรวจสอบคำตอบอัพเดท หากคุณไม่ได้กำหนดเป้าหมาย 26 API ให้ใช้รหัสเดียวกันกับที่.setPriority(Notification.PRIORITY_MAX)อื่นใช้รหัสที่อัปเดตสำหรับ 26 API `
Aks4125

31

โทรคอนสตรัค 2 หาเรื่อง:เข้ากันได้กับ Android O NotificationCompat.Builder(Context context, String channelId)โทรสนับสนุน เมื่อรันบน Android N หรือก่อนหน้านี้channelIdจะถูกละเว้น เมื่อรันบน Android O ยังสร้างด้วยเหมือนกันNotificationChannelchannelId

โค้ดตัวอย่างล้าสมัย: โค้ดตัวอย่างในหลายหน้า JavaDoc เช่นการแจ้งเตือนการเรียกผู้สร้างไม่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เลิกใช้แล้ว (ดูNotificationCompat.Builder v7 .) ก่อนหน้านี้ v7 จำเป็นต้องได้รับการสนับสนุนNotificationCompat.Builder NotificationCompat.MediaStyleใน Android O มี v4 NotificationCompat.MediaStyleอยู่ในแพ็คเกจของไลบรารีที่เข้ากันได้กับสื่อ การใช้งานที่หนึ่งถ้าคุณต้องการandroid.support.v4.mediaMediaStyle

API 14+:ใน Support Library ตั้งแต่ 26.0.0 ขึ้นไปแพ็คเกจ support-v4 และ support-v7 รองรับระดับ API ขั้นต่ำที่ 14 ชื่อ v # เป็นข้อมูลประวัติ

ดูการแก้ไขสนับสนุนห้องสมุดล่าสุด


22

แทนที่จะตรวจสอบเพื่อหาBuild.VERSION.SDK_INT >= Build.VERSION_CODES.Oคำตอบให้มากที่สุดแนะนำให้มีวิธีที่ง่ายกว่าเล็กน้อย -

เพิ่มบรรทัดต่อไปนี้ในapplicationส่วนของไฟล์AndroidManifest.xmlตามที่อธิบายไว้ในแอปไคลเอ็นต์การตั้งค่า Cloud Fire Cloud บน Android doc:

    <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 Constructor ที่มี 2 พารามิเตอร์ (เนื่องจาก Constructor เก่าที่มี 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());
}

1
มันง่ายกว่านี้อย่างไร? : S
Nactus

17

นี่คือตัวอย่างรหัสซึ่งทำงานใน 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());

8

ตัวอย่างง่ายๆ

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

รหัสที่ถูกต้องคือ:

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 = คุณจะใช้วิธีการบางอย่างแล้ววิธีเดียวกันนี้จะใช้ในด้านขวาของ = สำหรับการจัดสรรด้วยใหม่

ลองใช้รหัสนี้ ... มันจะใช้งานได้


1

ตัวสร้างนี้เลิกใช้แล้วใน API ระดับ 26.1.0 ใช้ NotificationCompat.Builder (บริบทสตริง) แทน การแจ้งเตือนที่โพสต์ทั้งหมดต้องระบุรหัส NotificationChannel


อาจเพิ่มความคิดเห็นด้วยลิงก์ไปยังเอกสารแทนการคัดลอก cat และโพสต์เป็นคำตอบ
JacksOnF1re

0
  1. จำเป็นต้องประกาศช่องการแจ้งเตือนด้วย Notification_Channel_ID
  2. สร้างการแจ้งเตือนด้วย ID ช่องทางนั้น ตัวอย่างเช่น,

...
 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());
...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.