Frage NotificationCompat.Builder in Android O veraltet


Nach dem Upgrade meines Projekts nach Android O

buildToolsVersion "26.0.1"

Lint in Android Studio zeigt eine veraltete Warnung für die Methode der folgenden Benachrichtigungserstellung:

new NotificationCompat.Builder(context)

Das Problem ist: Android-Entwickler aktualisieren ihre Beschreibung der Dokumentation NotificationChannel um Benachrichtigungen in Android O zu unterstützen und uns ein Snippet mit der gleichen veralteten Warnung bereitzustellen:

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

Benachrichtigungen Übersicht

Meine Frage: Gibt es eine andere Lösung für die Erstellung von Benachrichtigungen und weiterhin Android O?

Eine Lösung, die ich gefunden habe, besteht darin, die Channel-ID als Parameter im Notification.Builder-Konstruktor zu übergeben. Aber diese Lösung ist nicht genau wieder verwendbar.

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

75
2017-08-02 13:44


Ursprung


Antworten:


In der Dokumentation wird die Builder-Methode erwähnt NotificationCompat.Builder(Context context) ist veraltet. Und wir müssen den Konstruktor verwenden, der die channelId Parameter:

NotificationCompat.Builder(Context context, String channelId)

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

Dieser Konstruktor wurde in der API-Version 26.0.0-beta1 nicht weiter unterstützt. benutzen   NotificationCompat.Builder (Kontext, String) statt. Alle gepostet   Benachrichtigungen müssen eine NotificationChannel ID angeben.

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

Dieser Konstruktor wurde in API-Ebene 26 veraltet   Notification.Builder (Kontext, String) statt. Alle gepostet   Benachrichtigungen müssen eine NotificationChannel ID angeben.

Wenn Sie die Builder-Setter wiederverwenden möchten, können Sie den Builder mit der ChannelId erstellen und diesen Builder an eine Hilfsmethode übergeben und Ihre bevorzugten Einstellungen in dieser Methode festlegen.


63
2017-08-02 15:52



Hier ist Arbeitscode für alle Android-Versionen ab API LEVEL 26+ mit Abwärtskompatibilität.

 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 für API 26, um Max-Priorität festzulegen

    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



Rufen Sie den 2-Arg-Konstruktor auf: Rufen Sie support-v4 auf, um mit Android O kompatibel zu sein NotificationCompat.Builder(Context context, String channelId). Wenn auf Android N oder früher ausgeführt wird, channelId wird ignoriert. Wenn Sie mit Android O arbeiten, erstellen Sie auch ein NotificationChannel mit dem gleichen channelId.

Veralteter Beispielcode: Der Beispielcode auf mehreren JavaDoc-Seiten wie z Notification.Builder Berufung new Notification.Builder(mContext) ist nicht mehr aktuell.

Veraltete Konstruktoren:  Notification.Builder(Context context) und v4  NotificationCompat.Builder(Context context) sind veraltet zugunsten von Notification[Compat].Builder(Context context, String channelId). (Sehen Notification.Builder (android.content.Context) und v4 NotificationCompat.Builder (Kontextkontext).)

Veraltete Klasse: Die ganze Klasse v7  NotificationCompat.Builder ist veraltet. (Sehen v7 NotificationCompat.Builder.) Zuvor v7 NotificationCompat.Builder wurde benötigt, um zu unterstützen NotificationCompat.MediaStyle. In Android O gibt es eine v4 NotificationCompat.MediaStyle in dem Medienkompatible Bibliothekist es android.support.v4.media Paket. Benutze das, wenn du brauchst MediaStyle.

API 14+: In der Support-Bibliothek ab 26.0.0 unterstützen die Pakete support-v4 und support-v7 beide eine Mindest-API-Stufe von 14. Die v # -Namen sind historisch.

Sehen Letzte Überarbeitung der Support-Bibliothek.


20
2017-08-09 01:15



Anstatt nach zu suchen Build.VERSION.SDK_INT >= Build.VERSION_CODES.O wie viele Antworten vorschlagen, gibt es einen etwas einfacheren Weg -

Fügen Sie die folgende Zeile hinzu application Abschnitt von AndroidManifest.xml Datei wie in der Richten Sie eine Firebase Cloud Messaging-Client-App auf Android ein doc:

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

Fügen Sie dann der Zeile eine Zeile mit einem Kanalnamen hinzu Werte / Zeichenfolgen.xml Datei:

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

Danach können Sie die neue Version von NotificationCompat.Builder Konstruktor mit 2 Parametern (da der alte Konstruktor mit 1 Parameter in Android Oreo veraltet ist):

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



Hier ist der Beispielcode, der in Android Oreo und weniger als Oreo funktioniert.

  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



Einfache Probe

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

Der richtige Code lautet:

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

mit Abhängigkeit 26.0.1 und neuen aktualisierten Abhängigkeiten wie 28.0.0.

Einige Benutzer verwenden diesen Code in der Form von:

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

Also Logic ist das, welche Methode du deklarierst oder initiierst, dann wird dieselbe Methode auf der rechten Seite für die Zuweisung verwendet. Wenn in Leftside of = Sie eine Methode verwenden, wird die gleiche Methode in der rechten Seite von = für Allocation with new verwendet.

Versuchen Sie diesen Code ... Es wird sicher funktionieren


2
2018-05-26 13:56



Dieser Konstruktor wurde in API-Ebene 26.1.0 nicht weiter unterstützt. Verwenden Sie stattdessen NotificationCompat.Builder (Kontext, Zeichenfolge). Alle veröffentlichten Benachrichtigungen müssen eine NotificationChannel-ID enthalten.


1
2018-05-04 06:38