从 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

【讨论】:

@Shid val playPauseState = if (mp?.isPlaying == true) PlaybackStateCompat.STATE_PLAYING else PlaybackStateCompat.STATE_PAUSED 谢谢,我想通了,您是如何设法将值持续发送到活动以更新 seekBar?

以上是关于从 MediaBrowserService 更新活动中的搜索栏的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

带有 ExoPlayer 和 PlayerControlView 的 MediaBrowserService - 如何从 UI (PlayerControlView) 访问播放器实例?

将媒体项添加到 MediaBrowserService

是否可以连接到 Spotify 的 MediaBrowserService?

前台 MediaBrowserService 在应用退出时被终止

别把SEO当苦力活,做优化要讲究策略

有赞一面:亿级用户DAU日活统计,有几种方案?