web-dev-qa-db-fra.com

Échec de publication de la notification sur le canal "null". La cible de l'API est 26

Deux journaux montrant 

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

2: Consultez la documentation de setSound () pour savoir quoi utiliser avec Android.media.AudioAttributes afin de qualifier votre cas d'utilisation de lecture.

 Showing this

26
Mohit Singh

Lorsque vous ciblez Android 8.0 (API niveau 26), vous devez implémenter un ou plusieurs canaux de notification pour afficher les notifications destinées à vos utilisateurs.

int NOTIFICATION_ID = 234;

    NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);


    if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.O) {


        String CHANNEL_ID = "my_channel_01";
        CharSequence name = "my_channel";
        String Description = "This is my channel";
        int importance = NotificationManager.IMPORTANCE_HIGH;
        NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, name, importance);
        mChannel.setDescription(Description);
        mChannel.enableLights(true);
        mChannel.setLightColor(Color.RED);
        mChannel.enableVibration(true);
        mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
        mChannel.setShowBadge(false);
        notificationManager.createNotificationChannel(mChannel);
    }

    NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx, CHANNEL_ID)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(title)
            .setContentText(message);

    Intent resultIntent = new Intent(ctx, MainActivity.class);
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(ctx);
    stackBuilder.addParentStack(MainActivity.class);
    stackBuilder.addNextIntent(resultIntent);
    PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

    builder.setContentIntent(resultPendingIntent);

    notificationManager.notify(NOTIFICATION_ID, builder.build());
21
Mohit Singh

La réponse de Gulzar Bhat fonctionne parfaitement si votre API minimum est Oreo. Si votre minimum est toutefois inférieur, vous devez inclure le code NotificationChannel dans une vérification du niveau de la plate-forme. Après cela, vous pouvez toujours utiliser l'identifiant, qui sera ignoré avant Oreo:

if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.O) {
    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.createNotificationChannel(notificationChannel);
}

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID);

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify((int)(System.currentTimeMillis()/1000), mBuilder.build());
14
Herrbert74

Vous pouvez résoudre ce problème de deux manières, mais vous devez créer un canal de notification avec un identifiant de canal spécifique.

NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
String id = "my_channel_01";
int importance = NotificationManager.IMPORTANCE_LOW;
NotificationChannel mChannel = new NotificationChannel(id, name,importance);
mChannel.enableLights(true);
mNotificationManager.createNotificationChannel(mChannel);

La première méthode consiste à définir le canal de notification dans le constructeur:

Notification notification = new Notification.Builder(MainActivity.this , id).setContentTitle("Title");
mNotificationManager.notify("your_notification_id", notification);

La deuxième façon consiste à définir le canal par Notificiation.Builder.setChannelId ()

Notification notification = new Notification.Builder(MainActivity.this).setContentTitle("Title").
setChannelId(id);
mNotificationManager.notify("your_notification_id", notification);

J'espère que cela t'aides

4
Milad Moosavi

Commencez par créer le canal de notification:

public static final String NOTIFICATION_CHANNEL_ID = "4655";
//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 utilisez l'identifiant de 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)
                .setContent(contentView)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setLargeIcon(picture)
                .setTicker(sTimer)
                .setContentIntent(timerListIntent)
                .setAutoCancel(false);
4
Gulzar Bhat

Ce problème est lié à l'ancienne version de FCM.

Mettez à jour votre dépendance avec com.google.firebase:firebase-messaging:15.0.2 Ou supérieur. 

Cela corrigera l'erreur

failed to post notification on channel null

lorsque votre application reçoit des notifications en arrière-plan, car Firebase fournit désormais un canal de notification par défaut avec les paramètres de base.

Mais vous pouvez également spécifier le canal de notification par défaut pour FCM dans le manifeste.

<meta-data
Android:name="com.google.firebase.messaging.default_notification_channel_id"
Android:value="@string/default_notification_channel_id"/>

Pour en savoir plus ici

2
Yuri Popiv
String CHANNEL_ID = "my_channel";

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this,CHANNEL_ID);
1
Gowtham

J'ai eu un problème similaire mais en démarrant un service en tant qu'activité d'arrière-plan, ce service fonctionnait dans le code suivant:

public static final int PRIMARY_FOREGROUND_NOTIF_SERVICE_ID = 1001;

@Override
public void onCreate() {
    super.onCreate();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

        String id = "_channel_01";
        int importance = NotificationManager.IMPORTANCE_LOW;
        NotificationChannel mChannel = new NotificationChannel(id, "notification", importance);
        mChannel.enableLights(true);

        Notification notification = new Notification.Builder(getApplicationContext(), id)
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("My chat")
                .setContentText("Listening for incoming messages")
                .build();

        NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        if (mNotificationManager != null) {
            mNotificationManager.createNotificationChannel(mChannel);
            mNotificationManager.notify(PRIMARY_FOREGROUND_NOTIF_SERVICE_ID, notification);
        }

        startForeground(PRIMARY_FOREGROUND_NOTIF_SERVICE_ID, notification);
    }
}

Ce n'est pas la meilleure solution mais juste pour démarrer le service en arrière-plan Cela fonctionne

0
Douglas Caina