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

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

Введите описание изображения здесь

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

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

ОБНОВИТЬ

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

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

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


СТАРЫЙ ОТВЕТ

От взгляда на исходный код класса 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 Музыка также не включает его).

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

  .setShowCancelButton(true) .setCancelButtonIntent(stopPendingIntent) 

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

Добавляем к ответу @ matiash:

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

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

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

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