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

时间:2013-07-23 19:45:47

标签: 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 update Volume Panel.
VolumePanel(2261): change volume by MSG_VOLUME_CHANGED
VolumePanel(2261): onVolumeChanged(streamType: 6, flags: 0)
VolumePanel(2261): Call setChangeSeekbarColor(false)

我也尝试处理媒体按钮操作,但这不起作用。我的想法是一个免费的可配置键映射:用户选择“设置键”,我的应用程序听到所有键(硬件,媒体按钮,蓝牙耳机),然后用户按下一个键,事件/密钥代码存储在配置中。

总结不工作的答案: 音量按钮必须由“VOLUME_CHANGED_ACTION”捕获。问题是这个意图被广播到其他应用程序并且abortBroadcast()不起作用(它仅适用于“有序”广播)。另一个问题是有线耳机和手机上的按键触发onReceive()两次(为什么?)蓝牙耳机会触发一次。 下一个问题是蓝牙耳机上的第3个键。它触发语音命令(s-s在s3上启动),我试图捕获许多不同的意图,但我不能“接收”这个按钮按下而不知道为什么。 最后,我希望捕获各种按钮,并且不希望它们由其他应用程序处理(例如使用onKeyDown并返回true)。

3 个答案:

答案 0 :(得分:28)

MEDIA_BUTTON添加广播监听器:

<intent-filter android:priority="<some number>"> 
   <action android:name="android.intent.action.MEDIA_BUTTON" /> 
</intent-filter> 

您应该在应用程序内注册广播接收器(而不是在清单文件中)。否则,Google音乐播放器会抓住您的广播并加入其中。

您的IntentFilter优先级应该高于手机中其他媒体播放器的优先级

在清单中添加android.permission.BLUETOOTH权限以支持蓝牙耳机

收到密钥后,您必须使用abortBroadcast()手动中止广播。

但是,只要每个应用只响应,优先级和abortBroadcast()就可以正常工作 例如玩的东西。 但是一些用户还希望按下按钮时启动(或开始播放)“默认播放器”,就像默认播放器一样,因此可能会发生某些优先级较高的应用不会让意图通过您的应用< / p>

onReceive中,您可以使用

获取按钮事件
KeyEvent key = (KeyEvent) 
intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 

key.getKeyAction()告诉您按钮是否已被释放或按下,key.getKeyCode()告诉您按下了哪个按钮。

如果您还想处理单键电缆耳机,也可以 关注密钥代码KEYCODE_HEADSETHOOK

在任何活动中覆盖onKeyDown方法并检查 KeyEvent.KEYCODE_MEDIA_KEYCODE_pressed_key

例如

 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; 
    } 

卷密钥集成示例 Android - Volume Buttons used in my application
这个可能需要许可

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


或者您可以通过以下链接尝试更简洁的实施    
Android Developer Blog : Handling remote control buttons
     Android Tales : Add Headset button support to your Android application

答案 1 :(得分:2)

结帐this article。它解释了如何使用媒体按钮操作实现类似的功能。

我知道你提到过你这样走路没有成功,还是试一试。请注意与注册广播接收器,设置意图过滤器优先级和添加权限相关的问题(所有这些都在文章中解释)。

希望这会有所帮助。

答案 2 :(得分:1)

如果您尝试通过某项活动收听此消息,请使用onKeyDown()并抓住KEYCODE_MEDIA_PLAY_PAUSEKEYCODE_MEDIA_PLAYKEYCODE_MEDIA_PAUSE帖子ICS)关键事件。

此外,对于广播接收器解决方案的工作,请确保在后台安装并运行其他应用程序,以捕获可能优先于您的事件。

另请注意:Android - registering a headset button click with BroadcastReceiver