Failed to post notification on channel “null” Target Api is 26

匿名 (未验证) 提交于 2019-12-03 08:36:05

问题:

Two log showing

1: Use of stream types is deprecated for operations other than volume control

2: See the documentation of setSound() for what to use instead with android.media.AudioAttributes to qualify your playback use case

回答1:

Gulzar Bhat's answer is working perfectly if your minimum API is Oreo. If your minimum is lower however, you have to wrap the NotificationChannel code in a platform level check. After that you can still use the id, which will be ignored pre 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()); 


回答2:

When you target Android 8.0 (API level 26), you must implement one or more notification channels to display notifications to your users.

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()); 


回答3:

First create the notification channel:

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); 

then use the channel id in the constructor:

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:

You can solve this in two ways but for both of them you need to create a notification channel with an specific channel id.

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); 

First way is to set channel for notification in constructor:

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

Second way is to set the channel by Notificiation.Builder.setChannelId()

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

Hope this helps



回答5:

This issue is related to the old FCM version.

Update your dependency to com.google.firebase:firebase-messaging:15.0.2 or higher.

This will fix the error

failed to post notification on channel null 

when your app receives notifications in the background because now Firebase provides a default notification channel with basic settings.

But you also can specify the default Notification Channel for FCM in the manifest.

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

To learn more here



回答6:

If you get this error should be paid attention to 2 items and them order:

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

Also NotificationManager notifManager and NotificationChannel mChannel are created only once.

There are required setters for Notification:

builder.setContentTitle() // required          .setSmallIcon()    // required         .setContentText()  // required   

See the example in On Android 8.1 API 27 notification does not display.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!