Android Media3: Как добавить кнопки поиска в медиа-уведомление?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Android Media3: Как добавить кнопки поиска в медиа-уведомление?

Сообщение Anonymous »

Потратив целую неделю на то, чтобы разобраться в этой невероятно сложной библиотеке, я пришел в замешательство. Я убежден, что существует готовое решение для этого пользовательского интерфейса мультимедийных уведомлений, которое в наши дни есть практически в каждом крупном приложении с воспроизведением мультимедиа. Он имеет кнопки поиска вперед и назад, кнопку скорости воспроизведения и кнопку избранного:
Изображение

Я точно выполнил эти инструкции, и мое уведомление не изменилось и выглядит вот так. Просто кнопка предыдущего трека:
Изображение

Я прочитал это проблема, когда разработчик признает, что это сложно (и обещает задокументировать это, лол), но я не понимаю решения, которое он объясняет.
Я не использую 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, но она там не появилась.
Может ли кто-нибудь мне помочь? Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/787 ... tification
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»