Лучший способ обновить панель поиска в действии из MediaBrowserService?

Итак, у меня есть 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 для действий кнопок.


person Yoann Far    schedule 23.12.2020    source источник


Ответы (1)


Я нашел другой способ, который, как мне кажется, может быть лучше.

Вы можете сохранить положение медиаплеера в состоянии воспроизведения

val stateBuilder = PlaybackStateCompat.Builder()
    stateBuilder.setState(
        playPauseState,
        mp?.currentPosition?.toLong() ?: PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN,
        1F
    )
    mediaSession.setPlaybackState(stateBuilder.build())

И затем в действии вы можете получить это следующим образом:

val timerPosition = mediaController.playbackState.position
person Yoann Far    schedule 23.12.2020
comment
@Шид val playPauseState = if (mp?.isPlaying == true) PlaybackStateCompat.STATE_PLAYING else PlaybackStateCompat.STATE_PAUSED - person Yoann Far; 21.05.2021
comment
Спасибо, я понял, и как вам удалось постоянно отправлять значение активности для обновления seekBar? - person Shid; 21.05.2021