Android Media3:如何向媒体通知添加搜索按钮?

问题描述 投票:0回答:1

在花了整整一个星期试图理解这个令人难以置信的复杂库之后,我已经束手无策了。我确信现在几乎所有具有媒体播放功能的主要应用程序中都存在针对此媒体通知 UI 的开箱即用解决方案。它有向前和向后搜索按钮、播放速度按钮和收藏夹按钮:enter image description here

我已经完全遵循了这些说明,并且我的通知没有任何变化,看起来像这样。只是上一曲目按钮:enter image description here

我读过这个问题,其中一位开发人员承认这很复杂(并承诺记录下来,哈哈),但我不明白他解释的解决方案。

我没有使用

PlayerNotificationManager
。 这是我到目前为止所拥有的,但不起作用。在我的
PlaybackService
中:

    private val back = CommandButton.Builder()
            .setEnabled(true)
            .setIconResId(androidx.media3.session.R.drawable.media3_notification_seek_back)
            .setDisplayName("Seek Back")
            .setPlayerCommand(Player.COMMAND_SEEK_BACK)
            .build()
    private val forward = CommandButton.Builder()
            .setEnabled(true)
            .setIconResId(androidx.media3.session.R.drawable.media3_notification_seek_forward)
            .setDisplayName("Seek Forward")
            .setPlayerCommand(Player.COMMAND_SEEK_FORWARD)
            .build()
    private val buttons = ImmutableList.of(back, forward)

    override fun onCreate() {
        super.onCreate()
        val intent = packageManager!!.getLaunchIntentForPackage(packageName)!!
            .let { sessionIntent ->
                PendingIntent.getActivity(this, SESSION_INTENT_REQUEST_CODE, sessionIntent, PendingIntent.FLAG_IMMUTABLE)
            }
        _session = MediaSession.Builder(this, buildPlayer())
            .setSessionActivity(intent)
            .setCustomLayout(buttons)
            .setCallback(CustomMediaSessionCallback())
            .build()
        setListener(PlaybackServiceListener()) // irrelevant to this question
    }

    private inner class CustomMediaSessionCallback: MediaSession.Callback {
      override fun onConnect(
          session: MediaSession,
          controller: MediaSession.ControllerInfo
      ): MediaSession.ConnectionResult {
          val sessionCommands = MediaSession.ConnectionResult.DEFAULT_PLAYER_COMMANDS.buildUpon()
              .add(back.playerCommand)
              .add(forward.playerCommand)
              .build()
          return MediaSession.ConnectionResult.AcceptedResultBuilder(session)
              .setCustomLayout(buttons)
              .setAvailablePlayerCommands(sessionCommands)
              .build()
      }
    }

在我的 ViewModel 中,我正在创建

SessionToken
MediaController
:

private val sessionToken =
        SessionToken(getApplication(), ComponentName(getApplication(), PlaybackService::class.java))
private val controllerFuture = MediaController.Builder(getApplication(), sessionToken).buildAsync()

一旦

MediaController
准备就绪,我就会添加
MediaItem
并开始播放。

with(controller!!) {
    playWhenReady = true
    setMediaItem(mediaItem)
    prepare()
}

需要明确的是,如果我从我的 .setCustomLayout(buttons) 中删除

.setCallback(CustomMediaSessionCallback())
MediaSession.Builder
绝对不会发生任何变化。没有效果。

我确实在 logcat 中收到警告:“在给定上下文中找不到唯一的注册媒体按钮接收器。”我在

media3 repo 中搜索了这个字符串,但它没有出现在那里。

有人可以帮助我吗?谢谢!

android notifications media exoplayer playback
1个回答
0
投票
我终于在 GitHub 上找到了一个代码库,其中包含我试图实现的通知 UI,而且看起来人们真的在自己滚动它。对我来说,这似乎完全是疯狂的,因为这不是开箱即用的,但我现在已经深入研究了这个垃圾库的内部。是时候从头开始构建布局并继续我的生活了。

如果我错了,请告诉我,我很乐意接受更好的答案。

© www.soinside.com 2019 - 2024. All rights reserved.