Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 2.2中的耳机和蓝牙AVRC传输控制的操作指南_Android_Headset - Fatal编程技术网

Android 2.2中的耳机和蓝牙AVRC传输控制的操作指南

Android 2.2中的耳机和蓝牙AVRC传输控制的操作指南,android,headset,Android,Headset,我试图找出处理Froyo中Intent.ACTION\u MEDIA\u按钮的正确(新)方法。在2.2天前,我们必须注册一个BroadcastReceiver(永久注册或在运行时注册),只要没有其他应用程序拦截并中止广播,媒体按钮事件就会出现 Froyo似乎仍然在某种程度上支持这种模式(至少对有线耳机是这样),但它还引入了registerDiaButtonVentReceiver和unregisterMediaButtonEventReceiver方法,这些方法似乎可以控制应用程序之间的“传输焦

我试图找出处理Froyo中Intent.ACTION\u MEDIA\u按钮的正确(新)方法。在2.2天前,我们必须注册一个BroadcastReceiver(永久注册或在运行时注册),只要没有其他应用程序拦截并中止广播,媒体按钮事件就会出现

Froyo似乎仍然在某种程度上支持这种模式(至少对有线耳机是这样),但它还引入了registerDiaButtonVentReceiver和unregisterMediaButtonEventReceiver方法,这些方法似乎可以控制应用程序之间的“传输焦点”

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

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

这是安卓平台上任何第三方媒体播放器都必须解决的问题,因此我希望有人(可能是谷歌工程师)能提供一些我们都可以遵循的指导原则。采用标准方法可能会让终端用户更容易预测耳机按钮控制


Stefan

经过一些实验,我能够在Android 2.2中使用新的传输和音频聚焦基础设施得到一个有效的解决方案

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

requestAudioFocus接受一个回调,当音频焦点离开您时调用该回调(例如,内部播放器开始播放)。在我的例子中,如果焦点是永久性的,我只是暂停应用程序中的播放。同样的回调现在也告诉你焦点只是暂时的(例如导航系统正在说话),所以你可以“闪开”你的播放-降低音量或暂停,然后在谈话结束后继续

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

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


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

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


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

Android会定期将媒体按钮注册返回到默认音乐播放器。我还不知道为什么。这可能发生在五月应用程序正在积极播放以及我的应用程序播放暂停时

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

我的应用程序在整个时间段内保持音频焦点,但在保持音频焦点的同时仍会定期丢失蓝牙按钮事件。如果在调用媒体按钮事件接收器时通知它正在丢失音频焦点,则我的应用程序始终会注销该接收器,如果稍后在临时音频焦点丢失返回音频焦点时调用该接收器,则会再次注册


保持2秒计时器运行和重新注册的工作一直在进行,但是,如果有人找到了媒体按钮注册的解决方案,定期切换回默认的媒体播放器,我想取消这个2秒计时器。

我发现,如果每次我收到“ACTION_AUDIO_Beging_Noise”事件时调用registerMediaButtonEventReceiver,就会捕捉到默认媒体播放器被禁用的情况从我的应用程序中抓取注册。我还必须调用abortBroadcast(),这样其他应用程序就不会在我之后获得此事件,然后在我刚刚再次注册媒体按钮后,将其抓取。