Как переопределить позицию воспроизведения в MediaSessionConnector Exoplayer2?
У меня есть MediaBrowserServiceCompat
сервис, который использует Exoplayer2
играть ConcatenatingMediaSource
список медиа-файлов, как если бы они были одним файлом. Он использует MediaSessionConnector
подключить Exoplayer до MediaControllerCompat
элементы управления воспроизведением, которые я использую в своем интерфейсе через стандартный MediaBrowserCompat
сессия.
Поскольку я хочу, чтобы список воспроизведения файлов мультимедиа отображался как единый файл, я сам обрабатываю уведомление о позиции воспроизведения, добавляя продолжительность предыдущих окон к текущей позиции следующим образом:
private val updatesRunnable = Runnable {
run {
val currentPosition = mSimpleExoPlayer.currentPosition
val windowIndex = mSimpleExoPlayer.currentWindowIndex
val position = mOffsetsArray[windowIndex] + currentPosition
val playbackStateBuilder = PlaybackStateCompat.Builder()
.setState(PlaybackStateCompat.STATE_PLAYING, position, 0f)
mMediaSessionCompat.setPlaybackState(playbackStateBuilder.build())
}
showUpdates()
}
Это в основном работает нормально, и мой пользовательский интерфейс показывает правильную позицию воспроизведения относительно всего списка воспроизведения, так что, например, если первый файл имеет длительность 1 минуту, второй файл отображается как начинающийся с "00:01:00" вместо того, чтобы начинать снова с "00:00:00".
Но пользовательский интерфейс также на мгновение показывает "00:00:00" всякий раз, когда Exoplayer перемещается к следующему объединенному файлу. Где-то MediaSessionConnector, по-видимому, сам устанавливает позицию воспроизведения MediaSessionCompat, и это противоречит позиции воспроизведения, которую я установил в исполняемом файле выше.
Как и где я могу получить MediaSessionConnector для обновления позиции воспроизведения, чтобы она относилась ко всем файлам в конкатенации, или в качестве альтернативы, как и где я могу запретить MediaSessionConnector полностью обновлять позицию воспроизведения, так что я могу просто сделать это сам? Я пробовал настройку doMaintainMetadata
в false
но это не останавливает обновление позиции MediaSessionConnector, как я и надеялся.
Моя проблема похожа на " Возможно ли иметь единую панель поиска для ConcatenatingMediaSource?", Но я не могу реализовать предоставленное там решение, потому что я использую свой собственный пользовательский интерфейс, а не пользовательский интерфейс Exoplayer, поэтому я не могу использовать setShowMultiWindowTimeBar
который решает эту проблему на стороне клиента. Мне нужно решить проблему со стороны службы, чтобы все игроки, присоединенные к сеансу (в идеале, включая игрока в панели уведомлений), показывали правильную позицию.
заранее спасибо
Джон