【问题标题】:MediaStyleNotification: Play/Pause button does not respond to clickMediaStyleNotification:播放/暂停按钮不响应点击
【发布时间】:2018-06-25 12:52:52
【问题描述】:

在我的应用程序中,当用户选择要播放的音频文件时,当文件准备好并且开始播放时,MediaStyle 通知会成功显示。

元数据信息已更新,标题、图标等。但是……

1.Play/Pause button does not respond to clicks.
2.Clicking the notification does not open the activity.
3.Swipe gesture triggers also… nothing

我不知道我错过了什么。你可以看看我的MediaBrowserService 课程。

【问题讨论】:

  • 快速浏览一下,您的班级似乎与this 的布局不同。还有另一个SO post 解释了如何从通知中打开意图。
  • 你是对的@WoodyDev,它不遵循你建议的布局。但我相信它确实遵循官方文档中的布局 -> developer.android.com/guide/topics/media-apps/audio-app/…
  • 你在最新版本的代码上试过了吗?通知中的播放/暂停按钮对我来说工作正常 - 在 Android 5.1 手机上测试。 [在 Android 8.0 上,由于某种原因没有显示通知]
  • 我认为您在使用主屏幕小部件时可能已经修复了它。很高兴他们在待处理的意图处理方面共享大部分相同的框架。

标签: android notifications android-notifications mediabrowserservice


【解决方案1】:

正在讨论的代码:

 private void showMediaStyleNotification() {
        // Given a media session and its context (usually the component containing the session)
        // Create a NotificationCompat.Builder

        // Get the session's metadata
        MediaControllerCompat controller = session.getController();
        MediaMetadataCompat mediaMetadata = controller.getMetadata();
        MediaDescriptionCompat description = mediaMetadata.getDescription();

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);

        // Add the metadata for the currently playing track
        builder
                .setContentTitle(description.getTitle())
                .setContentText(description.getSubtitle())
                .setSubText(description.getDescription())
                .setLargeIcon(description.getIconBitmap())

                // Enable launching the player by clicking the notification
                .setContentIntent(controller.getSessionActivity())

                // Stop the service when the notification is swiped away
                .setDeleteIntent(MediaButtonReceiver.buildMediaButtonPendingIntent(this,
                        PlaybackStateCompat.ACTION_STOP))

                // Make the transport controls visible on the lockscreen
                .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)

                // Add an app icon and set its accent color
                // Be careful about the color
                .setSmallIcon(R.drawable.ic_headset_pink_40dp)
                .setColor(ContextCompat.getColor(this, R.color.secondaryColor))

                // Add a pause button
                .addAction(new NotificationCompat.Action(
                        R.drawable.ic_pause_white_40dp, getString(R.string.pause_label),
                        MediaButtonReceiver.buildMediaButtonPendingIntent(this,
                                PlaybackStateCompat.ACTION_PLAY_PAUSE)))

                // Take advantage of MediaStyle features
                .setStyle(new MediaStyle()
                        .setMediaSession(session.getSessionToken())
                        .setShowActionsInCompactView(0)

                        // Add a cancel button
                        .setShowCancelButton(true)
                        .setCancelButtonIntent(MediaButtonReceiver.buildMediaButtonPendingIntent(this,
                                PlaybackStateCompat.ACTION_STOP)));

// Display the notification and place the service in the foreground
        startForeground(FOREGROUND_ID, builder.build());
    }
}

初始化媒体会话:

stateBuilder = new PlaybackStateCompat.Builder()
                .setActions(PlaybackStateCompat.ACTION_PLAY |
                        PlaybackStateCompat.ACTION_PLAY_PAUSE);
        session.setPlaybackState(stateBuilder.build());

当我按下播放/暂停时,它会进入这里:getPlaybackStateFromPlayerState。唯一有问题的是播放/暂停按钮图形没有更新。它总是显示暂停...

   case STARTED:
        return stateBuilder.setState(PlaybackStateCompat.STATE_PLAYING, currentPosition, playbackSpeed)
                .setActions(PlaybackStateCompat.ACTION_PAUSE | PlaybackStateCompat.ACTION_PLAY_PAUSE
                        | PlaybackStateCompat.ACTION_STOP | PlaybackStateCompat.ACTION_SEEK_TO
                        | PlaybackStateCompat.ACTION_PLAY)
                .build();
    case PAUSED:
        return stateBuilder.setState(PlaybackStateCompat.STATE_PAUSED, currentPosition, playbackSpeed)
                .setActions(PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_PLAY_PAUSE
                        | PlaybackStateCompat.ACTION_STOP | PlaybackStateCompat.ACTION_SEEK_TO
                        | PlaybackStateCompat.ACTION_PAUSE)
                .build();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2019-06-25
    • 2016-05-07
    • 1970-01-01
    相关资源
    最近更新 更多