在花了整整一个星期试图理解这个令人难以置信的复杂库之后,我已经束手无策了。我确信现在几乎所有具有媒体播放功能的主要应用程序中都存在针对此媒体通知 UI 的开箱即用解决方案。它有向前和向后搜索按钮、播放速度按钮和收藏夹按钮:
我已经完全遵循了这些说明,并且我的通知没有任何变化,看起来像这样。只是上一曲目按钮:
我读过这个问题,其中一位开发人员承认这很复杂(并承诺记录下来,哈哈),但我不明白他解释的解决方案。
我没有使用
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 中搜索了这个字符串,但它没有出现在那里。
有人可以帮助我吗?谢谢!
如果我错了,请告诉我,我很乐意接受更好的答案。