Câu hỏi NotificationCompat.Builder không dùng nữa trong Android O


Sau khi nâng cấp dự án của tôi lên Android O

buildToolsVersion "26.0.1"

Lint trong Android Studio đang hiển thị cảnh báo không được chấp nhận cho phương thức trình tạo thông báo sau:

new NotificationCompat.Builder(context)

Vấn đề là: Nhà phát triển Android cập nhật mô tả Tài liệu của họ NotificationChannel để hỗ trợ thông báo trong Android O và cung cấp cho chúng tôi một đoạn trích nhưng với cùng cảnh báo không được chấp nhận:

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

Tổng quan về thông báo

Câu hỏi của tôi: Có giải pháp nào khác để xây dựng thông báo và vẫn hỗ trợ Android O không?

Một giải pháp mà tôi tìm thấy là chuyển ID kênh làm tham số trong hàm tạo Notification.Builder. Nhưng giải pháp này không chính xác có thể tái sử dụng được.

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

76
2017-08-02 13:44


gốc


Nhưng giải pháp này không chính xác có thể tái sử dụng được. thế nào? - Tim Castelijns
NotificationCompat.Builder không được chấp nhận không phải là Notification.Builder. Chú ý phần Compat biến mất. Thông báo là lớp mới của họ, nơi họ sắp xếp mọi thứ - Kapil G
@ kapsym đó là cách khác xung quanh thực sự. Notification.Builder cũ hơn - Tim Castelijns
Thêm vào đó tôi không thấy nó bị phản đối ở đây developer.android.com/reference/android/support/v4/app/…. Có lẽ một lỗi trong Lint - Kapil G
Id kênh được truyền tại hàm tạo hoặc có thể được đặt bằng notificationBuild.setChannelId("channel_id"). Trong trường hợp của tôi, giải pháp cuối cùng này được tái sử dụng nhiều hơn NotificationCompat.Builder được tái sử dụng trong một vài phương pháp, tiết kiệm các thông số cho biểu tượng, âm thanh và rung. - GuilhermeFGL


Các câu trả lời:


Nó được đề cập trong tài liệu hướng dẫn phương pháp xây dựng NotificationCompat.Builder(Context context) đã không được chấp nhận. Và chúng ta phải sử dụng hàm tạo có channelId tham số:

NotificationCompat.Builder(Context context, String channelId)

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

Nhà xây dựng này đã không được chấp nhận ở cấp API 26.0.0-beta1. sử dụng   NotificationCompat.Builder (Context, String) để thay thế. Tất cả đã đăng   Thông báo phải chỉ định Id NotificationChannel.

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

Nhà xây dựng này đã không được chấp nhận ở cấp API 26. sử dụng   Thay vào đó là Notification.Builder (Context, String). Tất cả đã đăng   Thông báo phải chỉ định Id NotificationChannel.

Nếu bạn muốn sử dụng lại các bộ cài đặt trình xây dựng, bạn có thể tạo trình tạo bằng channelId và chuyển trình xây dựng đó tới phương thức trợ giúp và đặt các cài đặt ưa thích của bạn trong phương thức đó.


67
2017-08-02 15:52



Có vẻ như họ đang mâu thuẫn với bản thân khi đăng Notification.Builder(context) giải pháp trong phiên NotificationChannel. Nhưng tốt, ít nhất bạn đã tìm thấy một bài đăng thông báo về việc không dùng nữa =) - GuilhermeFGL
ChannelId bạn có thể giải thích là gì? - Santanu Sur
channelId là gì? - RoundTwo
Bạn vẫn có thể sử dụng NotificationCompat.Builder(Context context)và sau đó gán kênh như vậy: builder.setChannelId(String channelId) - deyanm
Id kênh có thể là bất kỳ chuỗi nào, quá lớn để thảo luận trong nhận xét nhưng nó được sử dụng để tách thông báo của bạn thành các danh mục để người dùng có thể tắt những gì anh cho là không quan trọng với anh ta thay vì chặn tất cả thông báo từ ứng dụng của bạn. - yehyatt


enter image description here

Đây là mã hoạt động cho tất cả các phiên bản Android API LEVEL 26+ với khả năng tương thích ngược.

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

CẬP NHẬT cho API 26 để đặt Mức độ ưu tiên tối đa

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

57
2017-11-15 09:32



Bạn đã sử dụng 'setDefaults' hai lần trong mã của bạn. - GuilhermeFGL
@GuilhermeFGL Cảm ơn bạn đã chỉ ra. Tôi đã cập nhật câu trả lời của mình - Aks4125
@BlueBoy kiểm tra câu trả lời cập nhật. nếu bạn không nhắm mục tiêu 26 API thì chỉ cần sử dụng cùng một mã với .setPriority(Notification.PRIORITY_MAX) sử dụng mã được cập nhật cho 26 API. ` - Aks4125
@ Aks4125 làm việc như quyến rũ :) - BlueBoy
Cảm ơn. Đây sẽ là câu trả lời được chấp nhận. @GuilhermeFGL - Naveed Ahmad


Gọi hàm tạo 2-arg: Để tương thích với Android O, hãy gọi hỗ trợ-v4 NotificationCompat.Builder(Context context, String channelId). Khi chạy trên Android N hoặc cũ hơn, channelId sẽ bị bỏ qua. Khi chạy trên Android O, cũng tạo NotificationChannel với cùng channelId.

Mã mẫu lỗi thời: Mã mẫu trên một số trang JavaDoc chẳng hạn như Notification.Builder gọi điện thoại new Notification.Builder(mContext) đã lỗi thời.

Nhà thầu không được chấp nhận:  Notification.Builder(Context context) và v4  NotificationCompat.Builder(Context context) không được ủng hộ Notification[Compat].Builder(Context context, String channelId). (Xem Notification.Builder (android.content.Context) và v4 NotificationCompat.Builder (Ngữ cảnh bối cảnh).)

Lớp không được chấp nhận: Cả lớp v7  NotificationCompat.Builder không được chấp nhận. (Xem v7 NotificationCompat.Builder.) Trước đây, v7 NotificationCompat.Builder là cần thiết để hỗ trợ NotificationCompat.MediaStyle. Trong Android O, có v4 NotificationCompat.MediaStyle bên trong -thư viện đa phương tiện'S android.support.v4.media gói. Sử dụng cái đó nếu bạn cần MediaStyle.

API 14+: Trong Thư viện hỗ trợ từ 26.0.0 trở lên, các gói hỗ trợ-v4 và hỗ trợ-v7 đều hỗ trợ cấp API tối thiểu là 14. Tên v # là lịch sử.

Xem Bản sửa đổi thư viện hỗ trợ gần đây.


20
2017-08-09 01:15





Thay vì kiểm tra Build.VERSION.SDK_INT >= Build.VERSION_CODES.O như nhiều câu trả lời gợi ý, có một cách hơi đơn giản hơn -

Thêm dòng sau vào application phần của AndroidManifest.xml tệp như được giải thích trong Thiết lập Ứng dụng khách nhắn tin trên đám mây của Firebase trên Android doc:

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

Sau đó thêm một dòng có tên kênh vào values ​​/ strings.xml tập tin:

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

Sau đó, bạn sẽ có thể sử dụng phiên bản mới của NotificationCompat.Builder hàm tạo với 2 tham số (vì hàm tạo cũ với tham số 1 đã không được chấp nhận trong 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());
}

12
2017-11-22 15:27





Đây là mã mẫu, hoạt động trong Android Oreo và ít hơn 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





Mẫu đơn giản

    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



Hoàn hảo! Cảm ơn. - Tgo1014
Chào đón của bạn ;-) - 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();  

Mã đúng sẽ là:

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

với sự phụ thuộc 26.0.1 và các phụ thuộc mới được cập nhật, chẳng hạn như 28.0.0.

Một số người dùng sử dụng mã này dưới dạng này:

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

Vì vậy, Logic là phương pháp mà bạn sẽ khai báo hoặc khởi tạo thì cùng một methode trên bên phải sẽ được sử dụng cho phân bổ. nếu trong Leftside = bạn sẽ sử dụng một số phương pháp thì phương pháp tương tự sẽ được sử dụng ở bên phải của = cho Phân bổ với mới.

Hãy thử mã này ... Nó chắc chắn sẽ hoạt động


2
2018-05-26 13:56





Nhà xây dựng này đã không được chấp nhận ở cấp API 26.1.0. sử dụng NotificationCompat.Builder (Context, String) để thay thế. Tất cả thông báo đã đăng phải chỉ định Id NotificationChannel.


1
2018-05-04 06:38