【问题标题】:Wrong volume control stream for CastPlayer in a Service服务中 CastPlayer 的音量控制流错误
【发布时间】:2019-04-11 04:14:07
【问题描述】:
我正在使用 ExoPlayer Google Cast 扩展程序 v2.8.4。使用 CastPlayer 播放内容时,设备的物理音量按钮应控制接收设备的音量。当 CastPlayer 包含在 Activity 中时,这将按预期运行。但是,当 CastPlayer 包含在 Service(例如 MediaBrowserServiceCompat)中时,物理音量按钮会更改发送方设备的媒体音量。
我创建了 2 个演示该问题的示例项目:
如下图所示,投射设备音量确实出现在完整音量控制视图中,但当 CastPlayer 处于服务状态时,手机的媒体音量是活动控制流。
有没有办法在服务实现中设置适当的音量控制流?
【问题讨论】:
标签:
android
google-cast
exoplayer
google-cast-sdk
【解决方案1】:
我已经确定了问题,原因不是 ExoPlayer 或 Cast 扩展程序中的错误。 CastVolumeControlServiceTest 中的 This commit 解决了这个问题。
在调试并查看设备日志后,我发现音量键事件被定向到活动的 MediaSession。通过将 MediaSession 设置为非活动状态,音量控制流将控制接收设备,因此解决方案是将 MediaSession 切换为活动/非活动状态,具体取决于当前播放器。
这看起来并不直观,但确实有效。
【解决方案2】:
此错误的解决方法是在您将 PendingResult 发送到投射接收器之前将 MediaSession 状态设置为 STATE_PLAYING。
val playbackState = PlaybackStateCompat.Builder()
.setState(PlaybackStateCompat.STATE_PLAYING, <position>, <playbackSpeed>)
.build()
mediaSession.setPlaybackState(playbackState)
<send action to cast>
那么您不必将 MediaSession 设置为非活动状态。