通过硬件按钮更改音量时投射图标

Posted

技术标签:

【中文标题】通过硬件按钮更改音量时投射图标【英文标题】:Cast icon when changing volume via HW buttons 【发布时间】:2015-07-01 10:47:22 【问题描述】:

我正在开发一个支持 GoogleCast 的应用程序。我正在使用 CastCompanionLibrary,一切正常,但我的应用程序中存在一个小问题。 我需要更改布局,以防用户通过硬件按钮更改音量。在我的应用程序中,布局如下所示:

此布局中有一个 Cast 图标,但它是白色的,并且它们的可见性非常差。例如,在 YouTube 应用程序中,相同的布局如下所示:

所以,我的问题很简单:如何更改布局,或者如何更改布局中的 Cast 图标?我在 CastCompanionLibrary 中看不到它。 感谢您的建议。

【问题讨论】:

【参考方案1】:

据我所知,您在更改音量时看到的 UI 是由系统通过 MediaSession 或 RemoteControlClient 等提供的,而不是应用程序本身。结果,我不知道有什么方法可以改变它。你在 YT 中看到的 UI 是自定义 UI,音量的处理是通过 app 完成的;实际上,如果您将 YT 应用程序发送到后台并更改音量,您会看到不同的 UI,因此他们似乎决定自己捕获硬件音量并提供自己的自定义 UI。只要您的应用程序在前面,这是可行的;一旦失去焦点(例如,当它进入后台时),您的应用程序就不会收到音量键事件,并且您的应用程序无法做很多事情(这也是 YT 发生的情况)。试试 Google Play 音乐,看看你在投射时改变音量时他们的 UI 是什么样子的。

【讨论】:

我这几天一直在寻找答案。从今天开始,YouTube 能够在后台控制投射设备的音量。它还显示了带有投射图标的系统音量控制。似乎无法弄清楚该怎么做。【参考方案2】:

为了实现这一点,播放器服务必须保持“活动”MediaSessionCompat。该服务应主动将媒体播放器的播放状态与MediaSessionCompat 同步。除此之外,服务必须在初始化时使用媒体会话调用MediaRouter#setMediaSessionCompat()。 如果满足所有这些条件,则在投射时,服务可以调用MediaSessionCompat#setPlaybackToRemote(VolumeProviderCompat)。然后每当播放器处于“播放”状态时,音量事件将被传递到调用VolumeProviderCompat 的 MediaSession。要切换回常规媒体控件,即在投射会话结束时,服务可以调用 MediaSessionCompat#setPlaybackToLocal(AudioManager.STREAM_*)

示例实现 - android MediaRouter Volume events

【讨论】:

以上是关于通过硬件按钮更改音量时投射图标的主要内容,如果未能解决你的问题,请参考以下文章

音量未更改时检测硬件音量按钮按下

更改设备音量

通过移动设备音量调高按钮调整 chromecast 电视音量

通过HW按钮改变音量时,投掷图标

按下音量按钮时更改音量滑块位置

当我的应用程序运行时,硬件音量按钮不起作用