19

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

如果我按下耳机上的按钮,“日志猫”会显示以下内容:

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.xml 中。

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

4

3 回答 3

31

将广播侦听器添加到MEDIA_BUTTON

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

您应该在应用程序中注册广播接收器(而不是在清单文件中)。否则,谷歌音乐播放器将捕捉您的广播并登上它。

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

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

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

abortBroadcast()但是,只要每个应用程序仅在播放某些内容时才响应,优先级和工作正常。但是一些用户还希望在按下按钮时启动(或开始播放)“默认播放器”,就像默认播放器一样,因此可能会发生某些具有更高优先级编号的应用程序不会让意图进入您的应用程序

在 中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 - 我的应用程序中使用的音量按钮
这个可能需要权限

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


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

Android 开发者博客:处理远程控制按钮
Android 故事:将耳机按钮支持添加到您的 Android 应用程序

于 2013-08-01T00:45:03.213 回答
2

看看这篇文章。它解释了如何使用媒体按钮操作来实现类似的东西。

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

希望这会有所帮助。

于 2013-07-26T18:54:31.910 回答
1

如果您尝试从活动中侦听此内容,请使用onKeyDown()并捕获KEYCODE_MEDIA_PLAY_PAUSEKEYCODE_MEDIA_PLAYKEYCODE_MEDIA_PAUSE发布 ICS)关键事件。

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

还要看看这个:Android - 使用 BroadcastReceiver 注册耳机按钮点击

于 2013-07-30T17:35:40.317 回答