42 votes

La notification d'Android O n'a pas été postée sur le canal - mais elle l'a été

Quelques questions sur les notifications d'Android O :

1) J'ai créé un canal de notification (voir ci-dessous), j'appelle le constructeur avec .setChannelId() (en passant le nom du canal que j'ai créé, "wakey" ; et pourtant, lorsque je lance l'application, j'obtiens un message indiquant que je n'ai pas réussi à envoyer une notification au canal "null". Quelle pourrait être la cause de ce problème ?

2) Je soupçonne que la réponse à la question 1 se trouve dans le "journal" qu'il faut vérifier, mais j'ai vérifié logcat et je ne vois rien concernant les notifications ou les canaux. Où se trouve le journal qu'il est conseillé de consulter ?

Voici le code que j'utilise pour créer le canal :

NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
CharSequence name = context.getString(R.string.app_name);
String description = "yadda yadda"
int importance = NotificationManager.IMPORTANCE_DEFAULT;

NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL, name, importance);
channel.setDescription(description);

notificationManager.createNotificationChannel(channel);

Voici le code pour générer la notification :

Notification.Builder notificationBuilder;

Intent notificationIntent = new Intent(context, BulbActivity.class);
notificationIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); // Fix for https://code.google.com/p/android/issues/detail?id=53313

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

Intent serviceIntent = new Intent(context, RemoteViewToggleService.class);
serviceIntent.putExtra(WakeyService.KEY_REQUEST_SOURCE, WakeyService.REQUEST_SOURCE_NOTIFICATION);

PendingIntent actionPendingIntent = PendingIntent.getService(context, 0, serviceIntent, PendingIntent.FLAG_CANCEL_CURRENT);
_toggleAction = new Notification.Action(R.drawable.ic_power_settings_new_black_24dp, context.getString(R.string.toggle_wakey), actionPendingIntent);

notificationBuilder= new Notification.Builder(context)
    .setContentTitle(context.getString(R.string.app_name))
    .setContentIntent(contentIntent)
    .addAction(_toggleAction);

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
    notificationBuilder.setChannelId(NOTIFICATION_CHANNEL);
}

notificationBuilder.setSmallIcon(icon);
notificationBuilder.setContentText(contentText);
_toggleAction.title = actionText;

int priority = getNotificationPriority(context);
notificationBuilder.setPriority(priority);
notificationBuilder.setOngoing(true);

Notification notification = notificationBuilder.build();
notificationManager.notify(NOTIFICATION_ID, notification);

Et voici l'avertissement que je reçois : enter image description here

43voto

jkane001 Points 964

Je pense avoir appris deux ou trois choses qui s'additionnent pour donner une réponse :

  1. J'utilisais un appareil émulateur, avec une image qui n'incluait pas le Play Store.
  2. La version de Google Play Services sur l'image n'était pas la plus récente, j'aurais donc dû recevoir une notification me disant que je devais effectuer une mise à niveau. Comme cette notification n'a pas été appliquée à un canal, elle n'est pas apparue.
  3. Si j'ai réglé logcat dans Android Studio sur "No Filters" au lieu de "Show only selected application", j'ai trouvé les journaux qui indiquaient que la notification en question était la notification "update needed" des Play Services.

Alors, j'ai changé pour une image avec le Play Store inclus, et il a montré la notification correctement (peut-être le canal pour cette notification devait être défini par le Play Store ?), m'a laissé mettre à jour vers les derniers Google Play Services, et je n'ai pas vu cet avertissement depuis.

Donc, pour faire court (trop tard), avec Android O, si vous utilisez les services Google Play et testez sur l'émulateur, choisissez une image avec le Play Store inclus, ou ignorez le toast (bonne chance pour celui-là !).

0 votes

Essayez le code ci-dessous pour définir le canal : new Notification.Builder(getApplicationContext(),FOLLOWERS_CHANNEL) .setContentTitle(title) .setContentText(body) .setSmallIcon(getSmallIcon()) ;

7voto

Gulzar Bhat Points 205

Créez d'abord le canal de notification :

 public static final String NOTIFICATION_CHANNEL_ID = "4565";
//Notification Channel
        CharSequence channelName = NOTIFICATION_CHANNEL_NAME;
        int importance = NotificationManager.IMPORTANCE_LOW;
        NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_NAME, importance);
        notificationChannel.enableLights(true);
        notificationChannel.setLightColor(Color.RED);
        notificationChannel.enableVibration(true);
        notificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});

NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.createNotificationChannel(notificationChannel);

puis utiliser l'identifiant du canal dans le constructeur :

final NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
                .setDefaults(Notification.DEFAULT_ALL)
                .setSmallIcon(R.drawable.ic_timers)
                .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400})
                .setSound(null)
                .setChannelId(NOTIFICATION_CHANNEL_ID)
                .setContent(contentView)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setLargeIcon(picture)
                .setTicker(sTimer)
                .setContentIntent(pendingIntent)
                .setAutoCancel(false);

0 votes

Pourquoi est-ce que setChannelId(NOTIFICATION_CHANNEL_ID) nécessaire ?

7voto

Robert Ramonet Points 68

J'ai eu le même problème, et je l'ai résolu en utilisant le constructeur

new Notification.Builder(Context context, String channelId) au lieu de celui qui est déprécié Niveaux onAPI >=26 (Android O) : new NotificationCompat.Builder(Context context)

Le code suivant ne fonctionnera pas si votre notificationBuilder est construit en utilisant le constructeur déprécié :

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
notificationBuilder.setChannelId(NOTIFICATION_CHANNEL);}

2 votes

J'ai eu environ 1k crashs à cause de ce constructeur déprécié... Merci !

5voto

Vous devez créer un canal avant.

private void createNotificationChannel() {
        // Create the NotificationChannel, but only on API 26+ because
        // the NotificationChannel class is new and not in the support library
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = getString(R.string.channel_name);
            String description = getString(R.string.channel_description);
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
            channel.setDescription(description);
            // Register the channel with the system; you can't change the importance
            // or other notification behaviors after this
            NotificationManager notificationManager = getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
}

public void notifyThis(String title, String message) {
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setSmallIcon(R.drawable.green_circle)
                .setContentTitle(title)
                .setContentText(message)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);

        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);

        // notificationId is a unique int for each notification that you must define
        notificationManager.notify(0, mBuilder.build());
}

Enfin, vous appelez cette méthode :

createNotificationChannel();
notifyThis("My notification", "Hello World!");

2voto

Abhilash Das Points 554

Créer une notification en utilisant le code suivant :

    Notification notification = new Notification.Builder(MainActivity.this)
              .setContentTitle("New Message")
                        .setContentText("You've received new messages.")
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .setChannelId(channelId)
                        .build();

ne pas utiliser :

Notification notification = new NotificationCompat.Builder(MainActivity.this)
                    .setContentTitle("Some Message")
                    .setContentText("You've received new messages!")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setChannel(channelId)
                    .build();

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