Добавление кнопки воспроизведения завершения с помощью Android L Notification.MediaStyle

Я хочу создать уведомление о воспроизведении мультимедиа, используя новый шаблон Android L MediaStyle. Теперь я отлично справился с такими действиями, как предыдущий, play, pause, next (используя addAction(), но я не смог найти способ добавить кнопку "закрыть", как в Документация по Android-уведомлениям скриншот:

enter image description here

Есть ли опрятный способ достичь этого? Я хочу, чтобы кнопка "закрыть" завершала воспроизводимое в данный момент воспроизведение, очищала уведомление о воспроизведении и располагалась так, как показано на скриншоте.

Ответы

Ответ 1

ОБНОВЛЕНИЕ

При использовании версии поддержки библиотеки этого стиля уведомлений, т.е. NotificationCompat.MediaStyle, существует кнопка setShowCancelButton().

Это добавит кнопку закрытия, но только в версиях до Lollipop, чтобы обойти ошибку с уведомлениями, которые нельзя отменить после отображения в качестве части службы переднего плана.

В Lollipop предпочтительным вариантом является просто возможность отклонить уведомление (когда аудио приостановлено) вместо того, чтобы создать пользовательскую кнопку.


OLD ANSWER

От взгляда на исходный код класса Notification.MediaStyle кажется, что в стиле уведомлений MediaStyle в данный момент нет поддержки:

    private RemoteViews makeMediaBigContentView() {
        final int actionCount = Math.min(mBuilder.mActions.size(), MAX_MEDIA_BUTTONS);
        RemoteViews big = mBuilder.applyStandardTemplate(getBigLayoutResource(actionCount),
                false /* hasProgress */);

        if (actionCount > 0) {
            big.removeAllViews(com.android.internal.R.id.media_actions);
            for (int i = 0; i < actionCount; i++) {
                final RemoteViews button = generateMediaActionButton(mBuilder.mActions.get(i));
                big.addView(com.android.internal.R.id.media_actions, button);
            }
        }
        styleText(big);
        hideRightIcon(big);
        applyTopPadding(big);
        big.setViewVisibility(android.R.id.progress, View.GONE);
        return big;
    }

Это соответствует макету, который он раздувает (notification_template_material_big_media), который содержит:

  • Макет для мультимедийного изображения.
  • LinearLayout для трех текстовых строк.
  • LinearLayout, в котором добавлены действия мультимедиа.
  • ImageView для отображения разделительной линии между этими двумя.

но ничего больше.

Похоже, что кнопка закрытия на странице документации - это просто исполнение исполнителя (Google Play Музыка также не включает его).

Ответ 2

Эта кнопка отмены, которую вы ищете:

  .setShowCancelButton(true)
  .setCancelButtonIntent(stopPendingIntent)

В вашем экземпляре MediaStyle.

Ответ 3

Добавление ответа @matiash:

  • Для Pre-Lollipop его ответ по мере необходимости.

    notificationBuilder.setStyle(new NotificationCompat.MediaStyle().setShowCancelButton(true).setCancelButtonIntent(createPlayIntent());
    
  • Для post-Lollipop: Чтобы запустить уведомление медиа-плеера, обязательно нужно использовать startForeground() для запуска Media Service как Foreground Service. Проблема в том, что этот Service не является допустимым. ДАЖЕ ЕСЛИ мы устанавливаем setOngoing(false).

Лучшая практика заключается в том, чтобы сделать Службу бесполезной в состоянии паузы. Для этого, когда ваш Media Service получит обратный вызов состояния паузы, вызовите stopForeground(false). Это останавливает службу, но сохраняет уведомление в ожидании. И теперь его можно отклонить.

Счастливое кодирование.