it-roy-ru.com

Не удалось опубликовать уведомление на канале "null" Target Api is 26

Два журнала показа 

1: использование типов потоков не рекомендуется для операций, отличных от управления громкостью

2: Смотрите документацию по setSound (), чтобы узнать, что использовать вместо этого с Android.media.AudioAttributes, чтобы квалифицировать ваш вариант использования воспроизведения

 Showing this

26
Mohit Singh

Когда вы ориентируетесь на Android 8.0 (уровень API 26), вы должны внедрить один или несколько каналов уведомлений для отображения уведомлений вашим пользователям.

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

Гульзар Бхат отвечает отлично, если ваш минимальный API - Oreo. Однако, если ваш минимум ниже, вы должны обернуть код NotificationChannel в проверку уровня платформы. После этого вы все равно можете использовать идентификатор, который будет игнорироваться перед 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

Вы можете решить эту проблему двумя способами, но для них обоих необходимо создать канал уведомлений с определенным идентификатором канала.

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

Первый способ - установить канал для уведомления в конструкторе:

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

Второй способ - установить канал с помощью Notificiation.Builder.setChannelId ().

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

Надеюсь это поможет

4
Milad Moosavi

Сначала создайте канал уведомлений:

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

затем используйте идентификатор канала в конструкторе:

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

Эта проблема связана со старой версией FCM.

Обновите свою зависимость до com.google.firebase:firebase-messaging:15.0.2 Или выше. 

Это исправит ошибку

failed to post notification on channel null

когда ваше приложение получает уведомления в фоновом режиме, потому что теперь Firebase предоставляет канал уведомлений по умолчанию с основными настройками.

Но вы также можете указать канал уведомления по умолчанию для FCM в манифесте.

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

Чтобы узнать больше здесь

2
Yuri Popiv
String CHANNEL_ID = "my_channel";

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

Если вы получили эту ошибку, следует обратить внимание на 2 предмета и их порядок:

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

Также NotificationManager notifManager и NotificationChannel mChannel создаются только один раз.

Для уведомлений требуются установщики:

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

См. Пример в В Android 8.1 API 27 уведомление не отображается .

0
Andy Sander

У меня была похожая проблема, но запуск службы в качестве фоновой операции, в службе работал этот код:

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

Это не лучшее решение, а просто запустить службу в фоновом режиме. Это работает

0
Douglas Caina