Итак, у меня есть MediaBrowserServiceCompat() для воспроизведения некоторых аудиофайлов с помощью MediaPlayer и одно действие с пользовательским интерфейсом воспроизведения текущего мультимедиа. В этом интерфейсе у меня есть индикатор выполнения, который я хотел бы обновить с помощью текущей позиции медиаплеера.
Я думал о том, чтобы иметь такой метод в сервисе, где каждую секунду я буду отправлять текущую позицию MediaPlayer через метаданные MediaSession:
private fun updateTimerMetadata() {
thread {
Thread.sleep(1000)
if (mp?.isPlaying == true) {
mediaSession.setMetadata(
MediaMetadataCompat.Builder()
.putLong("timerUpdate", mp?.currentPosition!!.toLong())
.build()
)
updateTimerMetadata()
}
}
}
Я бы получил его в действии в onMetadataChanged(), а затем обновил пользовательский интерфейс.
Но потом я подумал, что могу просто запустить таймер в действии и управлять им, когда он воспроизводится/приостанавливается, и тогда для этого не нужно связываться со службой. Но, возможно, есть риск, что панель не синхронизируется с медиаплеером...
Поэтому я хотел бы знать, что лучше всего подходит для решения этой проблемы?
Для связи между сервисом и активностью я использую MediaSession в сервисе:
mediaSession = MediaSessionCompat(baseContext, SERVICE_TAG).apply {
// Enable callbacks from MediaButtons and TransportControls
setFlags(
MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS
or MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS
)
// Set an initial PlaybackState with ACTION_PLAY, so media buttons can start the player
stateBuilder = PlaybackStateCompat.Builder()
.setActions(
PlaybackStateCompat.ACTION_PLAY
or PlaybackStateCompat.ACTION_PLAY_PAUSE
)
setPlaybackState(stateBuilder.build())
setSessionToken(sessionToken)
}
И MediaController в действии для вызова mediaController.transportControls для действий кнопок.