如何使用android从蓝牙耳机捕获关键事件

如何使用android从蓝牙耳机捕获关键事件,android,bluetooth,android-bluetooth,Android,Bluetooth,Android Bluetooth,我的应用程序可以由普通耳机控制。它只是覆盖了“onKeyDown”。但蓝牙耳机的关键事件并没有被捕获——为什么?或者如何捕获蓝牙密钥事件 如果我按下耳机上的按钮,“log cat”显示以下内容: Bluetooth AT recv(3043): AT+VGS=15 AudioPolicyManagerBase(13654): FM radio recording off AudioService(2261): sendVolumeUpdate, isKeyguardLocked...Not to

我的应用程序可以由普通耳机控制。它只是覆盖了“onKeyDown”。但蓝牙耳机的关键事件并没有被捕获——为什么?或者如何捕获蓝牙密钥事件

如果我按下耳机上的按钮,“log cat”显示以下内容:

Bluetooth AT recv(3043): AT+VGS=15
AudioPolicyManagerBase(13654): FM radio recording off
AudioService(2261): sendVolumeUpdate, isKeyguardLocked...Not to update Volume Panel.
VolumePanel(2261): change volume by MSG_VOLUME_CHANGED
VolumePanel(2261): onVolumeChanged(streamType: 6, flags: 0)
VolumePanel(2261): Call setChangeSeekbarColor(false)
我也尝试过处理媒体按钮操作,但这不起作用。我的想法是一个免费的可配置按键映射:用户选择我的应用程序在所有按键(硬件、媒体按钮、蓝牙耳机)上听到的“设置按键”,然后用户按下一个键,事件/按键代码存储在config中

总结不起作用的答案: 音量按钮必须由“音量更改动作”捕获。问题在于,此意图会广播到其他应用程序,而abortBroadcast()不起作用(它仅适用于“有序”广播)。另一个问题是有线耳机和手机上的按键会触发onReceive()两次(为什么?),蓝牙耳机会触发它一次。 下一个问题是蓝牙耳机上的第三个按键。它会触发语音命令(s-voice从s3开始),我试图捕捉到许多不同的意图,但我无法“接收”这个按钮,也不知道为什么。 最后,我希望捕获所有类型的按钮,而不希望它们被其他应用程序处理(比如使用onKeyDown和返回true)。

请检查。它解释了如何使用媒体按钮操作实现类似的功能

我知道你提到过你走这条路没有成功,还是试一下吧。请注意与注册广播接收器、设置意图过滤器优先级和添加权限相关的问题(本文将对此进行解释)


希望这会有所帮助。

如果您试图从活动中收听此消息,请使用
onKeyDown()
并捕捉
KEYCODE\u MEDIA\u PLAY\u PAUSE
KEYCODE\u MEDIA\u PLAY
KEYCODE\u MEDIA\u PAUSE
post ICS)按键事件

此外,为了使广播接收器解决方案能够正常工作,请确保后台没有安装和运行其他应用程序来捕获这些事件,这些应用程序可能会优先于您的应用程序


另请看以下内容:

将广播侦听器添加到
媒体按钮中

<intent-filter android:priority="<some number>"> 
   <action android:name="android.intent.action.MEDIA_BUTTON" /> 
</intent-filter> 
key.getKeyAction()
告诉您是释放还是按下按钮,
key.getKeyCode()
告诉您按下了哪个按钮

如果你想处理单键有线耳机,也 注意钥匙代码
KEYCODE\u头方法OK

覆盖任何活动中的
onKeyDown
方法并检查
KeyEvent.KEYCODE\u MEDIA\u KEYCODE\u按键


e、 g

 boolean onKeyDown(int keyCode, KeyEvent event) { 
            AudibleReadyPlayer abc; 
            switch (keyCode) { 
            case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: 
                    // code for fast forward 
                    return true; 
            case KeyEvent.KEYCODE_MEDIA_NEXT: 
                    // code for next 
                    return true; 
            case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: 
                    // code for play/pause 
                    return true; 
            case KeyEvent.KEYCODE_MEDIA_PREVIOUS: 
                    // code for previous 
                    return true; 
            case KeyEvent.KEYCODE_MEDIA_REWIND: 
                    // code for rewind 
                    return true; 
            case KeyEvent.KEYCODE_MEDIA_STOP: 
                    // code for stop 
                    return true; 
            } 
            return false; 
    } 
卷键集成示例
这个可能需要许可

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />


或者您可以通过以下链接尝试更精简的实现



thx-我会试试的。如果这项工作你会得到赏金,我试过了,但它不起作用:问题是它捕获了意图(音量更改或媒体按钮),但该意图也由所有其他音量按钮发送,并由注册到该事件的所有其他活动处理。我想捕捉事件并“消费”它-就像“onKeyDown”对HW键所做的那样。@Demoritz你确定你在广播接收器中调用了
abortBroadcast
?我刚刚尝试过:音量变化似乎是“非顺序广播”-abortBroadcast()对它不起作用。耳机上的另一个按钮(用于语音命令)根本无法捕获。我尝试添加各种动作,如“android.intent.action.VOICE\u COMMAND”和“android.speech.action.Recognite\u speech”,但我的动作没有反应-手机内置的“s-VOICE”总是在启动。@dermoritz我有一个想法,严格来说,这不是对你的问题的答案,但最终可能会阻止你找到解决方案。请检查此应用:。该公司表示,它适用于大多数蓝牙耳机(至少是符合标准的)。如果你的案例是这样的,你可以试着问作者/寻找资料来源或逆向工程,看看它是如何解决的。如果需要的话,我可以帮你做反向工程(以前做过类似的事情)。thx-但onKeyDown不适用于蓝牙,它只捕获有线耳机和电话键。而且我永远也无法确定某人正在运行或安装什么应用程序。有趣的是,我认为它会流行起来,就像这里提到的:?再看看链接中的第二个答案。哪个版本的Android?可能会改变后果冻豆与所有新的蓝牙Stuff最低版本是4.0和最高版本是4.2-我用4.1测试银河s3thx,但我想你没有阅读其他答案和我的评论。这不起作用:卷按钮不是“媒体按钮”。它们被“体积变化”捕获。由于此意图似乎是“未排序的”,因此“abortBroadcast()”不起作用-将抛出错误,并且卷仍将更改。另一方面,“KEYCODE_HEADSETHOOK”仅适用于有线耳机。蓝牙耳机发送启动语音识别的信号(s3上的s-voice)。我几乎没有尝试捕捉到这一点,但我没有成功。你是对的,似乎我在匆忙中错过了一些东西,对不起。这似乎是您正在寻求的答案[link]还添加权限
@YashwanthKrishnan:嘿,我应该设置什么优先级,以便我们的应用程序接收媒体按钮按键事件,而不是默认的音乐播放器?即使我的应用程序在前台,音乐播放器也会接收按键事件并播放,我已经将其设置为10000,但仍然没有运气。根据这一点,优先级必须大于-1000且小于1000。哪一版本的Android?最小版本为4.0,最大版本为4.2(在清单中指定),在galaxy s3上测试,使用4。1@dermoritz你偶然解决了这个问题吗?对不起,我不记得了,太久以前了
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />