Je reçois ce message lorsque j'essaie d'afficher une notification sur Android O.
L'utilisation de types de flux est déconseillée pour des opérations autres que le contrôle du volume
La notification provient directement des exemples de documents et s'affiche correctement sous Android 25.
Selon les commentaires sur cet article Google+ :
ces [avertissements] sont actuellement attendus lors de l'utilisation de
NotificationCompat
sur Android O périphériques (NotificationCompat
appelle toujourssetSound()
même si vous ne transmettez jamais de son personnalisé).jusqu'à ce que la bibliothèque de support modifie son code pour utiliser la version
AudioAttributes
desetSound
, vous recevrez toujours cet avertissement.
Par conséquent, vous ne pouvez rien faire à propos de cet avertissement. Comme indiqué dans le guide des canaux de notification , Android O déconseille de définir un son dans une notification individuelle. Vous devez plutôt définir le son sur un canal de notification utilisé par toutes les notifications d'un message particulier. type.
À partir de Android O, vous devez configurer NotificationChannel , et référencer ce canal lorsque vous essayez d'afficher une notification.
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());
Quelques notes importantes:
NotificationChannel
remplacent ceux spécifiés dans la variable Notification
. Je sais, c'est contre-intuitif. Vous devez soit déplacer les paramètres qui vont changer dans la notification, soit utiliser un NotificationChannel différent pour chaque configuration.NotificationChannel
après les avoir passés à createNotificationChannel()
. Vous ne pouvez même pas appeler deleteNotificationChannel()
puis essayer de le rajouter. L'utilisation de l'ID d'un NotificationChannel
supprimé le ressuscitera, et ce sera tout aussi immuable que lors de sa création. Il continuera à utiliser les anciens paramètres jusqu'à ce que l'application soit désinstallée. Vous feriez donc mieux de vous assurer des paramètres de votre chaîne et de réinstaller l'application si vous les manipulez pour qu'ils prennent effet.Tout ce que @ sky-kelsey a décrit est bon, Juste quelques ajouts mineurs :
Vous ne devez pas enregistrer le même canal à chaque fois s'il a déjà été enregistré, donc j'ai la méthode de la classe Utils qui crée un canal pour moi:
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>
Et j'appelle la méthode à chaque fois avant de montrer une notification du type:
...
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)
...
Un autre problème typique - le son par défaut du canal - décrit ici: https://stackoverflow.com/a/45920861/2133585
Dans Android O, il est impératif d'utiliser une NotificationChannel
et NotificationCompat.Builder
est obsolète ( référence ).
Voici un exemple de code:
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());