Adding a terminate playback button using Android L Notification.MediaStyle

十年热恋 提交于 2019-12-03 15:42:12

问题


I want to create a Media Playback notification using the new Android L MediaStyle template. Now, I succeeded doing so perfectly well for actions like previous, play, pause, next (by using addAction(), but I couldn't find a way to add a "close" button like in the Android Notifications Documentation screenshot:

Is there a neat way to achieve this? I want the "close" button to terminate the currently playing playback, clear the playback notification, and be located as in the attached screenshot.


回答1:


UPDATE

When using the Support Library's version of this notification style, i.e. NotificationCompat.MediaStyle, there is the setShowCancelButton() button.

This will add the close button, but only on versions prior to Lollipop, to work around a bug with notifications that cannot be made dismissable after being displayed as part of a foreground service.

In Lollipop the preferred option is to just being able to dismiss the notification (when the audio is paused) instead of having a custom button to do that.


OLD ANSWER

From taking a look at the source code of Notification.MediaStyle class it would seem that there is currently no support for such a button in the MediaStyle notification style:

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

This matches with the layout it inflates (notification_template_material_big_media), which contains:

  • A layout for the media image.
  • A LinearLayout for three text lines.
  • A LinearLayout where the media actions are added.
  • An ImageView to show the divider line between these two.

but nothing else.

It would appear that the close button in the documentation page is just an artist's rendition (Google Play Music doesn't include it, either).




回答2:


Adding on to @matiash's answer:

  1. For Pre-Lollipop his answer is as needed.

    notificationBuilder.setStyle(new NotificationCompat.MediaStyle().setShowCancelButton(true).setCancelButtonIntent(createPlayIntent());
    
  2. For post-Lollipop: To start a media-player notification one must have surely used startForeground() to start the Media Service as a Foreground Service. The problem now is that this Service is not dismissible. EVEN IF we set the setOngoing(false).

The best practice followed is to make the Service dismissible in the paused state. To do that, when your Media Service receives a Pause state callback, call stopForeground(false). This stops the service, but keeps the notification alive. And it can now be dismissed.

Happy coding.




回答3:


That's the cancel button you're looking for:

  .setShowCancelButton(true)
  .setCancelButtonIntent(stopPendingIntent)

On your MediaStyle instance.



来源:https://stackoverflow.com/questions/26828482/adding-a-terminate-playback-button-using-android-l-notification-mediastyle

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