web-dev-qa-db-fra.com

Sur Android 8.1 Notification API 27 ne s'affiche pas

Je reçois Toast sur Android 8.1 API 27:

Avertissement aux développeurs pour le package "my_package_name"
Impossible d’envoyer une notification le ...

Logcat inclut les prochaines chaînes:

Notification: L'utilisation de types de flux est déconseillée pour des opérations autres que le contrôle du volume

W/Notification: Consultez la documentation de setSound () pour savoir quoi utiliser à la place d'Android.media.AudioAttributes afin de qualifier votre cas d'utilisation de lecture.

E/NotificationService: Aucun canal trouvé pour pkg = my_package_name

Les informations complètes contenues dans Toast et dans Logcat peuvent vous aider à localiser ce problème.

28
Andy Sander

Si vous obtenez cette erreur, faites attention à 2 éléments et commandez-les:

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

De même, NotificationManager notifManager et NotificationChannel mChannel ne sont créés qu'une seule fois.

Il y a des setters requis pour Notification:

  • builder.setContentTitle () // requis
  • .setSmallIcon () // requis
  • .setContentText () // requis

Voir 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);
}
75
Andy Sander

La réponse de Andy fonctionne, mais je voulais éviter de rendre obsolète Builder et de suivre le FireBase Quickstart Project . Je viens d'ajouter du code avant de notifier par le gestionnaire.

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 supprimé le canal, vérifiez par exemple, je ne sais pas pourquoi.

16
engincancan

J'ai défini l'identifiant du canal, mais la notification n'est toujours pas affichée.

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

C'était vraiment m'aider que @ Andy Sander mentionné "les arrangeurs requis"!

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

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

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

notificationBuilder.setChannelId(channelId)

ou

NotificationCompat.Builder(Context context, String channelId)
3
asozcan