Pytanie NotificationCompat.Builder przestarzałe w Androidzie O


Po aktualizacji mojego projektu do Android O

buildToolsVersion "26.0.1"

Lint w Android Studio pokazuje przestarzałe ostrzeżenie dla następującej metody konstruktora powiadomień:

new NotificationCompat.Builder(context)

Problemem jest: Deweloperzy Androida aktualizują swoją dokumentację opisującą PowiadomienieChannel do obsługi powiadomień w Androidzie O i dostarczenia nam fragmentu, z tym samym przestarzałym ostrzeżeniem:

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

Przegląd powiadomień

Moje pytanie: Czy istnieje inne rozwiązanie do tworzenia powiadomień i nadal obsługuję Androida O?

Rozwiązaniem, które znalazłem, jest przekazanie identyfikatora kanału jako parametru w konstruktorze Notification.Builder. Ale to rozwiązanie nie nadaje się do wielokrotnego użytku.

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

76
2017-08-02 13:44


pochodzenie


Ale to rozwiązanie nie nadaje się do wielokrotnego użytku. jak to? - Tim Castelijns
NotificationCompat.Builder jest przestarzałe, a nie Notification.Builder. Zauważ, że część Compata odeszła. Powiadomienie to ich nowa klasa, w której wszystko upraszczają - Kapil G
@kapsym faktycznie jest odwrotnie. Powiadomienie.Builder jest starszy - Tim Castelijns
Plus nie widzę go przestarzałe tutaj developer.android.com/reference/android/support/v4/app/.... Może błąd w Lint - Kapil G
Identyfikator kanału jest przekazywany w konstruktorze lub może być umieszczony za pomocą notificationBuild.setChannelId("channel_id"). W moim przypadku to ostatnie rozwiązanie jest bardziej reużywalne jak moje NotificationCompat.Builder jest ponownie wykorzystywany w kilku metodach, zapisując parametry ikon, dźwięków i wibracji. - GuilhermeFGL


Odpowiedzi:


Jest to wspomniane w dokumentacji, że metoda budowniczego NotificationCompat.Builder(Context context) został przestarzały. I musimy użyć konstruktora, który ma channelId parametr:

NotificationCompat.Builder(Context context, String channelId)

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

Ten konstruktor został wycofany na poziomie interfejsu API 26.0.0-beta1. posługiwać się   NotificationCompat.Builder (Context, String) zamiast tego. Wszystkie opublikowane   Powiadomienia muszą określać identyfikator NotificationChannel.

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

Ten konstruktor został wycofany na poziomie interfejsu API 26. użycie   Notification.Builder (Context, String) zamiast tego. Wszystkie opublikowane   Powiadomienia muszą określać identyfikator NotificationChannel.

Jeśli chcesz ponownie użyć ustawiaczy kreatora, możesz utworzyć program budujący za pomocą identyfikatora channelId i przekazać ten program budujący do metody pomocnika i ustawić preferowane ustawienia w tej metodzie.


67
2017-08-02 15:52



Wygląda na to, że są sobie przeciwne, gdy publikujesz Notification.Builder(context) rozwiązanie w sesji NotificationChannel. Ale cóż, przynajmniej znalazłeś post powiadamiający o tym wycofaniu =) - GuilhermeFGL
Co to jest channelId, czy możesz wyjaśnić? - Santanu Sur
co to jest channelId? - RoundTwo
Możesz nadal używać NotificationCompat.Builder(Context context), a następnie przypisz taki kanał: builder.setChannelId(String channelId) - deyanm
Identyfikator kanału może być dowolnym ciągiem znaków, jest zbyt duży, aby można go było omawiać w komentarzach, ale służy do rozdzielania powiadomień na kategorie, aby użytkownik mógł wyłączyć to, co dla niego jest dla niego ważne, zamiast blokować wszystkie powiadomienia z aplikacji. - yehyatt


enter image description here

Oto działający kod dla wszystkich wersji Androida od POZIOM API 26+ z kompatybilnością wsteczną.

 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 dla API 26, aby ustawić Max priorytet

    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



Użyłeś "setDefaults" dwa razy w swoim kodzie. - GuilhermeFGL
@GuilhermeFGL Dzięki za wskazanie. Zaktualizowałem swoją odpowiedź - Aks4125
@BlueBoy sprawdź zaktualizowaną odpowiedź. jeśli nie korzystasz z 26 interfejsów API, po prostu użyj tego samego kodu .setPriority(Notification.PRIORITY_MAX) jeszcze użyj zaktualizowanego kodu dla 26 API. ` - Aks4125
@ Aks4125 działał jak czar :) - BlueBoy
Dzięki. To powinna być zaakceptowana odpowiedź. @GuilhermeFGL - Naveed Ahmad


Wywołaj konstruktor 2-arg: Aby uzyskać zgodność z Androidem O, dzwoń do support-v4 NotificationCompat.Builder(Context context, String channelId). Podczas działania na Androidzie N lub wcześniejszym, channelId zostaną zignorowane. Podczas pracy w Androidzie O utwórz także NotificationChannel z tym samym channelId.

Nieaktualny kod przykładowy: Przykładowy kod na kilku stronach JavaDoc, takich jak Powiadomienie.Builder powołanie new Notification.Builder(mContext) jest nieaktualne.

Przestarzałe konstruktory:  Notification.Builder(Context context) i v4  NotificationCompat.Builder(Context context) są przestarzałe na rzecz Notification[Compat].Builder(Context context, String channelId). (Widzieć Notification.Builder (android.content.Context) i v4 NotificationCompat.Builder (Kontekst kontekstowy).)

Przestarzała klasa: Cała klasa v7  NotificationCompat.Builder jest przestarzałe. (Widzieć v7 NotificationCompat.Builder.) Poprzednio v7 NotificationCompat.Builder był potrzebny do wsparcia NotificationCompat.MediaStyle. W Androidzie O jest v4 NotificationCompat.MediaStyle w biblioteka mediów-compat„s android.support.v4.media pakiet. Użyj tego, jeśli potrzebujesz MediaStyle.

API 14+: W bibliotece Wsparcia z wersji 26.0.0 i nowszej pakiety support-v4 i support-v7 obsługują minimalny poziom interfejsu API równy 14. Nazwy v # są historyczne.

Widzieć Najnowsze wersje biblioteki pomocy technicznej.


20
2017-08-09 01:15





Zamiast sprawdzać Build.VERSION.SDK_INT >= Build.VERSION_CODES.O jak wiele odpowiedzi sugeruje, jest nieco prostszy sposób -

Dodaj następujący wiersz do application Sekcja AndroidManifest.xml plik jak wyjaśniono w Skonfiguruj aplikację kliencką Firebase Cloud Messaging na Androida doc:

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

Następnie dodaj linię z nazwą kanału do wartości / strings.xml plik:

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

Potem będziesz mógł korzystać z nowej wersji NotificationCompat.Builder konstruktor z 2 parametrami (ponieważ stary konstruktor z 1 parametrem jest przestarzały w Androidzie 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





Oto przykładowy kod, który działa w systemie Android Oreo i mniej niż 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





Prosta próbka

    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



Idealny! Dzięki. - Tgo1014
Proszę bardzo ;-) - 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();  

Prawy kod będzie:

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

z zależnością 26.0.1 i nowymi zaktualizowanymi zależnościami, takimi jak 28.0.0.

Niektórzy użytkownicy używają tego kodu w formie:

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

Tak więc Logika jest tym, którą Metodę zadeklarujesz lub zainicjujesz, wtedy ta sama metoda po prawej stronie będzie używana do alokacji. jeśli w Leftside = będziesz używał jakiejś metody, to ta sama metoda będzie używana po prawej stronie = dla Allocation with new.

Wypróbuj ten kod ... To na pewno zadziała


2
2018-05-26 13:56





Ten konstruktor został wycofany na poziomie interfejsu API 26.1.0. zamiast tego użyj NotificationCompat.Builder (Context, String). Wszystkie opublikowane powiadomienia muszą określać identyfikator NotificationChannel.


1
2018-05-04 06:38