【问题标题】:Use MediaButton to control foreground app (no audio) with audio in background使用 MediaButton 控制前台应用程序(无音频),后台有音频
【发布时间】:2021-01-08 07:17:52
【问题描述】:

我想使用媒体按钮来控制前台应用程序,但不用于音频。 所以目标是检测按钮点击以在应用程序中执行某些操作。

我可以通过使用MediaSession 和MediaButtonReceiver 来实现。 see here

问题是,在使用应用时,用户经常在后台播放音乐,所以后台应用的音频焦点接管了 MediaSession,我无法再控制我的应用了。

有没有办法做到这一点?使用onKeyDown 直接监听按钮点击似乎不起作用。

【问题讨论】:

    标签: android media android-mediasession media-buttons


    【解决方案1】:

    遗憾的是,无法同时使用两个活跃的MediaSessions。如果另一个应用程序正在播放音乐并运行MediaSession,那么您的应用程序没有焦点并且没有激活......这是为了目的 - 更好的用户体验 - 只有一个“播放器”应用程序可以播放音乐(或视频)。如果这不起作用,并且您可以一次通过几个应用程序播放音乐,那么应该如何使用媒体按钮,例如耳机?暂停/恢复所有玩家?这只是对用户不友好,因此 Android 团队引入了MediaSession 模式,其中包含任何应用程序调用“立即关注我”的选项,但随后另一个应用程序/MediaSession 暂停并且没有得到任何输入(此活动会话确实)

    如果您需要按下物理按钮,那么onKeyDown 应该可以工作(在Activity 内或最终使用AccessibilityService,这将在整个系统中“全局”工作)。如果您需要一些屏幕上的通知按钮,那么只需使用任意数量的按钮制作custom layout for your notification,甚至可以作为播放器的样式

    请注意,在 Android 11 中,当您下拉状态栏时,活动的MediaSessions 通知会粘贴到通知部分的顶部。您的自定义通知将位于所有其他通知之间(您可以使用通知/通道的优先级参数稍微操纵位置)

    【讨论】:

    • 似乎onKeyDown 在我的活动活动 bc 中没有被调用。 MediaSessionService 正在吞噬它。那可能吗?使用 AccessibilityService 需要授予权限,这里不适合我。
    • 我可以接收 VOLME_UP 例如,但 KEYCODE_MEDIA_PLAY 不会传播到活动,但在日志中我看到 MediaSessionService 正在发送这些事件 - 所以不知何故传播的密钥/抓住了服务,但没有抓住我的跑步活动
    • KEYCODE_MEDIA_PLAY 是聚合事件 - 可能来自物理按钮(有线耳机、BT 扬声器等)或屏幕上可见的某些虚拟按钮(在应用程序或通知中)。这种聚合是由操作系统和/或 Google Play 服务(这是特权服务包)在系统级别完成的,用于上述目的 - 机制处理音频播放,防止多个输出同时输出,没有办法防止
    • 感谢您的澄清。所以除了MediaSession.Callback 之外,没有办法收听那些关键事件,但我不能使用它,因为我有背景音频......
    • 确切地说,播放音频和运行媒体会话的服务获得了音频焦点,并且它的回调被调用,所有其他都不会。即使您不播放任何音频,您几乎可以在任何时候获得音频焦点(例如,通过启动一些粘性 Service 并在 84573 秒后请求焦点),但这将使您的 Callback 激活禁用所有其他音频。就在从另一个/上一个MediaSession 音频/会话管理机制撤消焦点之前,将调用一些“暂停”方法来停止上一个音频并防止同时播放 - 这就是功能:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多