40 votes

Sur Android 8.1 API 27, la notification ne s'affiche pas

Je reçois Toast sur Android 8.1 API 27:

Développeur d'avertissement pour le paquet "my_package_name"
Échoué à mettre un avis sur les ...

Logcat se compose de chaînes de caractères:

Notification: l'Utilisation de types de flux est déconseillé pour des opérations autres de contrôle du volume

W/Avis: Voir la documentation de setSound() pour que l'utilisation au lieu d'android.médias.AudioAttributes pour bénéficier de votre lecture cas d'utilisation

E/NotificationService: Pas de Canal trouvé pour pkg=my_package_name

L'information complète dans le pain et dans le Logcat peut aider à la localisation de ce problème.

98voto

Andy Sander Points 1243

Si vous obtenez cette erreur devrait être prêté attention à 2 éléments et de leur ordre:

  1. NotificationChannel mChannel = new NotificationChannel(id, name, importance);
  2. builder = new NotificationCompat.Builder(context, id);

Aussi NotificationManager notifManager et NotificationChannel mChannel sont créés qu'une seule fois.

Il y a requis ouvreurs de Notification:

  • générateur de rapports.setContentTitle() // obligatoire
  • .setSmallIcon() // obligatoire
  • .setContentText() // obligatoire

Voir l'exemple:

private NotificationManager notifManager;
public void createNotification(String aMessage, Context context) {
    final int NOTIFY_ID = 0; // ID of notification
    String id = context.getString(R.string.default_notification_channel_id); // default_channel_id
    String title = context.getString(R.string.default_notification_channel_title); // Default Channel
    Intent intent;
    PendingIntent pendingIntent;
    NotificationCompat.Builder builder;
    if (notifManager == null) {
        notifManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        int importance = NotificationManager.IMPORTANCE_HIGH;
        NotificationChannel mChannel = notifManager.getNotificationChannel(id);
        if (mChannel == null) {
            mChannel = new NotificationChannel(id, title, importance);
            mChannel.enableVibration(true);
            mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
            notifManager.createNotificationChannel(mChannel);
        }
        builder = new NotificationCompat.Builder(context, id);
        intent = new Intent(context, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
        builder.setContentTitle(aMessage)                            // required
               .setSmallIcon(android.R.drawable.ic_popup_reminder)   // required
               .setContentText(context.getString(R.string.app_name)) // required
               .setDefaults(Notification.DEFAULT_ALL)
               .setAutoCancel(true)
               .setContentIntent(pendingIntent)
               .setTicker(aMessage)
               .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
    }
    else {
        builder = new NotificationCompat.Builder(context, id);
        intent = new Intent(context, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
        builder.setContentTitle(aMessage)                            // required
               .setSmallIcon(android.R.drawable.ic_popup_reminder)   // required
               .setContentText(context.getString(R.string.app_name)) // required
               .setDefaults(Notification.DEFAULT_ALL)
               .setAutoCancel(true)
               .setContentIntent(pendingIntent)
               .setTicker(aMessage)
               .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400})
               .setPriority(Notification.PRIORITY_HIGH);
    }
    Notification notification = builder.build();
    notifManager.notify(NOTIFY_ID, notification);
}

16voto

engincancan Points 1573

Andy réponse est de travailler mais je voulais éviter à obsolètes Builder et suivez les FireBase de Démarrage rapide du Projet. J'ai juste ajouté du code avant de l'informer de manager.

String channelId = "default_channel_id";
String channelDescription = "Default Channel";
// Since android Oreo notification channel is needed.
//Check if notification channel exists and if not create one
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
    NotificationChannel notificationChannel = notificationManager.getNotificationChannel(channelId);
    if (notificationChannel == null) {
        int importance = NotificationManager.IMPORTANCE_HIGH; //Set the importance level
        notificationChannel = new NotificationChannel(channelId, channelDescription, importance);
        notificationChannel.setLightColor(Color.GREEN); //Set if it is necesssary
        notificationChannel.enableVibration(true); //Set if it is necesssary
        notificationManager.createNotificationChannel(notificationChannel);
    }
}

//notificationManager.notify as usual

Edit: Ils ont enlevé le canal existe pas de vérifier à partir de l'exemple je ne suis pas sûr pourquoi.

10voto

Allen Points 701

J'ai défini l'identifiant de la chaîne, mais la notification n'est toujours pas affichée.

Enfin, j'ai trouvé que mon problème n'était pas dû à la méthode "setContentText ()".

Cela m'a vraiment aidé que @Andy Sander ait mentionné les "setters requis"!

voici les paramètres requis pour la notification sur Android 8 Oreo API 26 et versions ultérieures:

 builder.setContentTitle() // required
.setSmallIcon() // required
.setContentText() // required
.setChannelId(id) // required for deprecated in API level >= 26 constructor .Builder(this)
 

4voto

santawyus Points 27

N'oubliez pas non plus de lier votre channel_id à votre générateur de notifications. Après l'avoir lié, mon problème a disparu.

 notificationBuilder.setChannelId(channelId)
 

ou

 NotificationCompat.Builder(Context context, String channelId)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X