Уведомления всегда издают звук: setSound (null) не работает в ОС> = 8 - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь сгруппировать уведомления и вызывать звуки только для некоторых из них, используя метод setSound () построителя уведомлений, но это не работает.Каждый раз, когда я получаю уведомления, он вызывает рингтон, даже если я вызываю setSound (null)

Это мой код:

    TaskStackBuilder  stackBuilder = TaskStackBuilder.create(getContext());
    stackBuilder.addParentStack(getParentActivityClass());

    Intent notificationIntent = intent == null ? new Intent() : new Intent(intent);
    if (cls != null)
        notificationIntent.setClass(getContext(), cls);

    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

    stackBuilder.addNextIntentWithParentStack(notificationIntent);
    PendingIntent pendingIntent = stackBuilder.getPendingIntent(0,
            PendingIntent.FLAG_UPDATE_CURRENT);

    InboxStyle style = new NotificationCompat.InboxStyle();
    int mapId = subGroupId + groupId;
    putGroupLine(mapId, text);
    List<String> notifLines = groupedNotificationsMap.get(mapId);
    for (int i = 0; i < notifLines.size(); i++) {
        style.addLine(notifLines.get(i));
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        String NOTIFICATION_CHANNEL_ID = "default";
        String channelName = "Default";
        NotificationChannel chan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, channelName
                , NotificationManager.IMPORTANCE_HIGH);
        chan.setLightColor(Color.BLUE);
        chan.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
        if (alert == false) {
            chan.setSound(null, null);
            chan.setVibrationPattern(null);
        }
        else {
            chan.setVibrationPattern(vibrate);
        }
        NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        manager.createNotificationChannel(chan);
    }

    NotificationCompat.Builder mBuilder;
    mBuilder =  new NotificationCompat.Builder(context, "default")
            .setSmallIcon(getSmallIconResource())
            .setAutoCancel(true);

    int colorRes = getSmallIconColor();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        mBuilder.setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_SUMMARY);
    }

    if (alert) {
        mBuilder.setSound(getRingtone());
        mBuilder.setVibrate( vibrate );
    }
    else {
        mBuilder.setSound(null);
        mBuilder.setVibrate(null);
    }

    Notification notif = mBuilder
            .setContentTitle(title)
            .setTicker(text)
            .setContentText(text)
            .setSmallIcon(getSmallIconResource())
            .setStyle(style
                    .setBigContentTitle(title)
            )
            .setGroup("g" + groupId)
            .setContentIntent(pendingIntent)
            .build();

    NotificationCompat.Builder summaryBiulder = new NotificationCompat.Builder(getContext(), "default")
            .setContentTitle(title)
            .setAutoCancel(true)
            //set content text to support devices running API level < 24
            .setContentText(text)
            .setSmallIcon(getSmallIconResource())
            //build summary info into InboxStyle template
            .setStyle(new InboxStyle()
                    .setBigContentTitle(title)
                    .setSummaryText(title))
            .setColor(colorRes)
            //specify which group this notification belongs to
            .setGroup("g" + groupId)
            //set this notification as the summary for the group
            .setGroupSummary(true)

            .setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_SUMMARY)
            .setContentIntent(pendingIntent);

    if (alert) {
        summaryBiulder.setSound(getRingtone());
        summaryBiulder.setVibrate( vibrate );
    }
    else {
        summaryBiulder.setSound(null);
        summaryBiulder.setVibrate(null);
    }


    Notification summaryNotification = summaryBiulder .build();


    notif.flags |= Notification.FLAG_AUTO_CANCEL;
    notif.flags |= Notification.FLAG_HIGH_PRIORITY;

    notifManager.notify(subGroupId, notif);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        notifManager.notify(groupId, summaryNotification);
    }

Есть предложения?

Ответы [ 3 ]

1 голос
/ 12 марта 2019

Ваша проблема в важности уведомлений

типы важности

  • IMPORTANCE_MAX: не используется
  • IMPORTANCE_HIGH: показывает везде, шумит и заглядывает
  • IMPORTANCE_DEFAULT: показывает везде, шумит, но визуально не мешает
  • IMPORTANCE_LOW: показывает везде, но не навязчиво
  • IMPORTANCE_MIN: отображается только в тени, ниже сгиба
  • IMPORTANCE_NONE: уведомление без значения; не показывает в тени

источник

1 голос
/ 12 марта 2019

В фрагменте кода,

 NotificationChannel chan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, channelName,
                                 NotificationManager.IMPORTANCE_HIGH);

Попробуйте заменить

NotificationManager. IMPORTANCE_HIGH для NotificationManager. IMPORTANCE_NONE

Согласно документации разработчика Android,

IMPORTANCE_HIGH

Более высокая важность уведомления: показывает везде, шумит и заглядывает. Может использовать полноэкранные намерения.

Так что из-за этого может издавать звук.

Вот ссылка на другие доступные значения важности

0 голосов
/ 18 марта 2019

Хотя другие ответы полезны, основной проблемой здесь было то, что канал уведомлений уже был создан. Итак, как указано в документации, поведение канала не может быть изменено после создания (звук и вибрация в этом случае). Только имя и описание могут быть изменены, пользователь имеет полный контроль над остальными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...