2

我试图弄清楚在 Froyo 中处理 Intent.ACTION_MEDIA_BUTTON 的正确(新)方法是什么。在 2.2 之前的日子里,我们必须注册一个 BroadcastReceiver(永久或在运行时),只要没有其他应用程序拦截它们并中止广播,媒体按钮事件就会到达。

Froyo 似乎仍然在一定程度上支持该模型(至少对于有线耳机而言),但它还引入了 registerMediaButtonEventReceiver 和 unregisterMediaButtonEventReceiver 方法,这些方法似乎可以控制应用程序之间的“传输焦点”。

在我的实验中,使用 registerMediaButtonEventReceiver 确实会导致蓝牙和有线耳机按钮按下都被路由到应用程序的广播接收器(应用程序获得“传输焦点”),但它看起来像音频路由的任何变化(例如拔下耳机)将焦点拉回默认媒体播放器。

Android 2.2 的实现背后的逻辑是什么?处理运输控制的正确方法是什么?我们是否必须检测音频路由的变化并尝试重新获得焦点?

这是 Android 平台上任何 3rd 方媒体播放器都必须处理的问题,因此我希望有人(可能是 Google 工程师)可以提供一些我们都可以遵循的指导方针。采用标准方法可能会使最终用户更容易预测耳机按钮控制。

斯特凡

4

3 回答 3

2

Google 有一篇详细的博客文章,介绍了如何实现较新的 2.2 AudioManager 媒体按钮事件接收器,同时保持与旧设备的向后兼容性。

http://android-developers.blogspot.com/2010/06/allowing-applications-to-play-nicer.html

于 2010-12-10T14:21:03.630 回答
1

经过一些实验,我能够使用 Android 2.2 中的新传输和音频焦点基础架构获得一个可行的解决方案。

我最终做的是每次我的应用程序开始播放时都请求音频焦点(使用 AudioManager.requestAudioFocus)和 Trasport 焦点(使用 AudioManagter.registerMediaButtonEventReceiver)。

requestAudioFocus 接受一个回调,当音频焦点离开您时调用该回调(例如,内部播放器开始播放)。在我的情况下,如果永久获得焦点,我只会暂停我的应用程序中的播放。相同的回调现在还告诉您焦点只是暂时的(例如导航系统正在说话),因此您可以“躲避”您的播放 - 降低音量或暂停并在完成通话后恢复。

剩下的唯一问题是,每次连接蓝牙耳机时,内置的音乐播放器都会占据传输焦点。其效果是,在连接耳机后第一次按下耳机上的播放按钮时,始终会在默认音乐播放器中开始播放。

可能有一种方法可以检测耳机连接并“劫持”传输焦点。就我而言,我决定不“与”默认播放器“对抗”,并在用户在我的应用程序中手动开始播放时重新获得传输焦点。

如果有人有更多见解或知道处理传输/音频焦点的更好方法,请分享。

于 2010-05-27T12:49:27.267 回答
0

我对媒体按钮注册也有同样的问题。

Android 会定期将媒体按钮注册返回到默认音乐播放器。我一直无法弄清楚为什么。这可能发生在应用程序正在积极播放以及我的应用程序播放暂停时。

在许多用户抱怨他们的蓝牙暂停和播放控制按钮会定期停止工作以控制我的应用程序后,我实现了通过每 2 秒调用 registerMediaButtonEventReceiver 重新注册我的应用程序的代码。这使我可以取回按钮注册,并且在很大程度上避免了用户按下蓝牙媒体按钮和默认媒体播放器最终响应的时间窗口。

我的应用程序在整个时间段内一直保持音频焦点,但在具有音频焦点时仍会定期丢失蓝牙按钮事件。我的应用程序总是取消注册媒体按钮事件接收器,如果它被调用并通知它正在失去音频焦点,然后如果稍后在临时音频焦点丢失返回音频焦点时调用它,则再次注册。

保持 2 秒计时器运行和重新注册的解决方法一直在工作,但如果有人发现媒体按钮注册定期切换回默认媒体播放器的解决方法,我想摆脱这个 2 秒计时器.

于 2011-09-14T06:46:15.580 回答