从 MediaBrowserService 更新活动中的搜索栏的最佳方法?
Posted
技术标签:
【中文标题】从 MediaBrowserService 更新活动中的搜索栏的最佳方法?【英文标题】:Best way to update seekbar in activity from a MediaBrowserService? 【发布时间】:2020-12-23 14:00:39 【问题描述】:所以我有一个 MediaBrowserServiceCompat() 来使用 MediaPlayer 播放一些音频,以及一个使用当前媒体播放的 UI 界面的活动。 在这个界面上,我有一个进度条,我想用媒体播放器的当前位置来更新它。
我正在考虑在服务中使用这种方法,每秒钟我都会通过 MediaSession 的元数据发送 MediaPlayer 的当前位置:
private fun updateTimerMetadata()
thread
Thread.sleep(1000)
if (mp?.isPlaying == true)
mediaSession.setMetadata(
MediaMetadataCompat.Builder()
.putLong("timerUpdate", mp?.currentPosition!!.toLong())
.build()
)
updateTimerMetadata()
我会在 onMetadataChanged() 的活动中接收它,然后更新 UI。
但后来我想我可以在活动中启动一个计时器并在它播放/暂停时对其进行管理,然后无需为此与服务进行通信。但也许酒吧与媒体播放器不同步会有风险......
所以我想知道处理这个问题的最佳方法是什么?
为了在服务和活动之间进行通信,我在服务中使用了 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 在 Activity 中调用 mediaController.transportControls 来执行按钮的操作。
【问题讨论】:
【参考方案1】:我发现了另一种我认为可能更好的方法。
播放状态下可以保存媒体播放器的位置
val stateBuilder = PlaybackStateCompat.Builder()
stateBuilder.setState(
playPauseState,
mp?.currentPosition?.toLong() ?: PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN,
1F
)
mediaSession.setPlaybackState(stateBuilder.build())
然后在activity中,可以这样获取:
val timerPosition = mediaController.playbackState.position
【讨论】:
@Shidval playPauseState = if (mp?.isPlaying == true) PlaybackStateCompat.STATE_PLAYING else PlaybackStateCompat.STATE_PAUSED
谢谢,我想通了,您是如何设法将值持续发送到活动以更新 seekBar?以上是关于从 MediaBrowserService 更新活动中的搜索栏的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章
带有 ExoPlayer 和 PlayerControlView 的 MediaBrowserService - 如何从 UI (PlayerControlView) 访问播放器实例?
是否可以连接到 Spotify 的 MediaBrowserService?