我正在使用ExoPlayer Google Cast扩展v2.8.4。使用CastPlayer播放内容时,设备的物理音量按钮应控制接收器设备的音量。当CastPlayer包含在Activity中时,此行为的行为符合预期。但是,当CastPlayer包含在服务(例如MediaBrowserServiceCompat)中时,物理音量按钮会更改发送方设备的媒体音量。
我创建了2个示例项目来演示该问题:
如下图所示,投射设备的音量确实出现在完整音量控件视图中,但是当CastPlayer处于服务状态时,手机的媒体音量是活动控件流。
是否可以在Service实现中设置适当的音量控制流?
答案 0 :(得分:1)
我已经确定了问题,原因不是由于ExoPlayer或Cast扩展程序中的错误。 This commit中的CastVolumeControlServiceTest解决了该问题。
在调试并查看了设备的日志后,我发现音量键事件被定向到活动的MediaSession。通过将MediaSession设置为非活动状态,音量控制流将控制接收器设备,因此解决方案是将MediaSession切换为活动/非活动状态,具体取决于哪个Player当前。
这似乎并不直观,但可以。
答案 1 :(得分:0)
此错误的解决方法是在将PendingResult发送到强制接收器之前,将MediaSession状态设置为STATE_PLAYING。
val playbackState = PlaybackStateCompat.Builder()
.setState(PlaybackStateCompat.STATE_PLAYING, <position>, <playbackSpeed>)
.build()
mediaSession.setPlaybackState(playbackState)
<send action to cast>
然后,您不必将MediaSession设置为非活动状态。