如何使用android从蓝牙耳机捕获关键事件
我的应用程序可以由普通耳机控制。它只是覆盖了“onKeyDown”。但蓝牙耳机的关键事件并没有被捕获——为什么?或者如何捕获蓝牙密钥事件 如果我按下耳机上的按钮,“log cat”显示以下内容:如何使用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
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" />