wake-up-neo.com

Benachrichtigungen werden in Android Oreo (API 26) nicht angezeigt

Ich erhalte diese Meldung, wenn ich versuche, eine Benachrichtigung auf Android O.

Die Verwendung von Stream-Typen ist für andere Vorgänge als die Lautstärkeregelung veraltet

Die Benachrichtigung stammt direkt aus den Beispieldokumenten und wird in Android 25.

43
Sky Kelsey

Per den Kommentaren zu dieser Google+ Beitrag :

diese [Warnungen] werden derzeit bei der Verwendung von NotificationCompat auf Android O-Geräten (NotificationCompat ruft immer setSound() auf, auch wenn Sie nie vorbeigehen benutzerdefinierten Sound).

bis die Support-Bibliothek ihren Code so ändert, dass die AudioAttributes -Version von setSound verwendet wird, wird diese Warnung immer angezeigt.

Daher können Sie gegen diese Warnung nichts unternehmen. Gemäß Anleitung für Benachrichtigungskanäle , Android O wird das Festlegen eines Sounds für eine einzelne Benachrichtigung überhaupt nicht empfohlen, stattdessen müssen Sie den Sound für einen Benachrichtigungskanal festlegen, der von allen Benachrichtigungen verwendet wird eines bestimmten Typs.

60
ianhanniballake

Beginnend mit Android O, müssen Sie ein NotificationChannel konfigurieren und auf diesen Kanal verweisen, wenn Sie versuchen, eine Benachrichtigung anzuzeigen.

private static final int NOTIFICATION_ID = 1;
private static final String NOTIFICATION_CHANNEL_ID = "my_notification_channel";

...

NotificationManager notificationManager = (NotificationManager) getSystemService(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(this, NOTIFICATION_CHANNEL_ID)
  .setVibrate(new long[]{0, 100, 100, 100, 100, 100})
  .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
  .setSmallIcon(R.mipmap.ic_launcher)
  .setContentTitle("Content Title")
  .setContentText("Content Text");

  notificationManager.notify(NOTIFICATION_ID, builder.build());

Ein paar wichtige Hinweise:

  1. Einstellungen wie das in NotificationChannel angegebene Vibrationsmuster haben Vorrang vor den in Notification angegebenen Einstellungen. Ich weiß, es ist kontraintuitiv. Sie sollten entweder Einstellungen verschieben, die sich in der Benachrichtigung ändern, oder für jede Konfiguration einen anderen NotificationChannel verwenden.
  2. Sie können die meisten Einstellungen von NotificationChannel nicht mehr ändern, nachdem Sie sie an createNotificationChannel() übergeben haben. Sie können deleteNotificationChannel() nicht einmal aufrufen und dann versuchen, es erneut hinzuzufügen. Wenn Sie die ID eines gelöschten NotificationChannel verwenden, wird es wiederbelebt und ist genauso unveränderlich wie bei seiner ersten Erstellung. Es werden weiterhin die alten Einstellungen verwendet, bis die App deinstalliert wird. Sie sollten sich also über Ihre Kanaleinstellungen im Klaren sein und die App neu installieren, wenn Sie mit diesen Einstellungen herumspielen, damit sie wirksam werden.
44
Sky Kelsey

Alles, was @ sky-kelsey beschrieben hat, ist gut, Nur kleinere Ergänzungen :

Sie sollten nicht jedes Mal denselben Kanal registrieren, wenn er bereits registriert wurde. Ich habe die Utils-Klassenmethode , die einen Kanal für mich erstellt:

public static final String NOTIFICATION_CHANNEL_ID_LOCATION = "notification_channel_location";

public static void registerLocationNotifChnnl(Context context) {
    if (Build.VERSION.SDK_INT >= 26) {
        NotificationManager mngr = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
        if (mngr.getNotificationChannel(NOTIFICATION_CHANNEL_ID_LOCATION) != null) {
            return;
        }
        //
        NotificationChannel channel = new NotificationChannel(
                NOTIFICATION_CHANNEL_ID_LOCATION,
                context.getString(R.string.notification_chnnl_location),
                NotificationManager.IMPORTANCE_LOW);
        // Configure the notification channel.
        channel.setDescription(context.getString(R.string.notification_chnnl_location_descr));
        channel.enableLights(false);
        channel.enableVibration(false);
        mngr.createNotificationChannel(channel);
    }
}

strings.xml:

<string name="notification_chnnl_location">Location polling</string>
<string name="notification_chnnl_location_descr">You will see notifications on this channel ONLY during location polling</string>

Und ich rufe die Methode jedes Mal auf, bevor ich eine Benachrichtigung des Typs zeige:

    ...
    NotificationUtil.registerLocationNotifChnnl(this);
    return new NotificationCompat.Builder(this, NotificationUtil.NOTIFICATION_CHANNEL_ID_LOCATION)
            .addAction(R.mipmap.ic_launcher, getString(R.string.open_app),
                    activityPendingIntent)
            .addAction(Android.R.drawable.ic_menu_close_clear_cancel, getString(R.string.remove_location_updates),
                    servicePendingIntent)
            .setContentText(text)
            ...

Ein weiteres typisches Problem - Channel Default Sound - wird hier beschrieben: https://stackoverflow.com/a/45920861/2133585

8
Kirill Vashilo

In Android O muss ein NotificationChannel verwendet werden, und NotificationCompat.Builder Ist veraltet ( Referenz ).

Unten ist ein Beispielcode:

NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(mContext.getApplicationContext(), "notify_001");
Intent ii = new Intent(mContext.getApplicationContext(), RootActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, ii, 0);

NotificationCompat.BigTextStyle bigText = new NotificationCompat.BigTextStyle();
bigText.bigText(verseurl);
bigText.setBigContentTitle("Today's Bible Verse");
bigText.setSummaryText("Text in detail");

mBuilder.setContentIntent(pendingIntent);
mBuilder.setSmallIcon(R.mipmap.ic_launcher_round);
mBuilder.setContentTitle("Your Title");
mBuilder.setContentText("Your text");
mBuilder.setPriority(Notification.PRIORITY_MAX);
mBuilder.setStyle(bigText);

NotificationManager mNotificationManager =
        (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    NotificationChannel channel = new NotificationChannel("notify_001",
            "Channel human readable title",
            NotificationManager.IMPORTANCE_DEFAULT);
    mNotificationManager.createNotificationChannel(channel);
}

mNotificationManager.notify(0, mBuilder.build());
2