我正在为Android OS 4.0.3(ICS)编写一个Android应用程序.问题是我没有从BroadcastReceive的onReceive()方法获取Log.d()的输出,这意味着我的应用程序没有正确处理广播.
我已经阅读了关于如何在单击ACTION_MEDIA_BUTTON时运行代码的无数问题.当我的工作不起作用时,我甚至复制+粘贴代码,只是为了看看它是否可行.
我想要处理的ACTION_MEDIA_BUTTON是耳机上的单个按钮,允许用户接听/结束通话,播放/暂停音乐.当我点击它时,而不是我的应用程序处理此按钮,我的Nexus S Android上的股票音乐播放器开始播放一首歌曲.
我没有将我的代码放在另一个类中,也许这就是为什么它不起作用?
这是在onCreate()方法上找到的代码(这个特定的代码是在我编写的代码无效后从网站上复制的):
IntentFilter mediaButtonFilter = new IntentFilter(
Intent.ACTION_MEDIA_BUTTON);
mediaButtonFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
BroadcastReceiver brMediaButton = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
Log.d("Event", "Media button!");
this.abortBroadcast();
KeyEvent key = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if(key.getAction() == KeyEvent.ACTION_UP) {
int keycode = key.getKeyCode();
if(keycode == KeyEvent.KEYCODE_MEDIA_NEXT) {
Log.d("TestApp", "Next Pressed");
} else if(keycode == KeyEvent.KEYCODE_MEDIA_PREVIOUS) {
Log.d("TestApp", "Previous pressed");
} else if(keycode == KeyEvent.KEYCODE_HEADSETHOOK) {
Log.d("TestApp", "Head Set Hook pressed");
}
}
} …Run Code Online (Sandbox Code Playgroud) 我的应用程序可以通过普通耳机控制.它只是覆盖"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)
Run Code Online (Sandbox Code Playgroud)
我也尝试处理媒体按钮操作,但这不起作用.我的想法是一个免费的可配置键映射:用户选择"设置键"我的应用程序听到所有键(硬件,媒体按钮,蓝牙耳机),然后用户按下一个键,事件/密钥代码存储在配置中.
总结不工作的答案: 音量按钮必须由"VOLUME_CHANGED_ACTION"捕获.问题是这个意图被广播到其他应用程序并且abortBroadcast()不起作用(它仅适用于"有序"广播).另一个问题是有线耳机和手机上的按键触发onReceive()两次(为什么?)蓝牙耳机会触发一次.下一个问题是蓝牙耳机上的第3个键.它触发语音命令(s-s在s3上启动),我试图捕获许多不同的意图,但我不能"接收"这个按钮按下而不知道为什么.最后,我希望捕获各种按钮,并且不希望它们由其他应用程序处理(例如使用onKeyDown并返回true).
我知道有些设备的耳机端口(可能都是这些?这里的任何参考都很好)有3个声道,用于立体声和麦克风.所以我想知道是否有可能在这些设备上检测到这样的踏板.
如果可能的话,使用录音机就足够了吗?我正在研究应用程序的可能性,如果可能的话,这听起来很有希望.
谢谢
编辑
我正在寻找更多关于它的信息,我想知道踏板是否会与带按钮的耳机具有相同的效果.覆盖它们的效果是致命的,我创建了一个简单的应用程序来完成它,现在我正在等待我的踏板尝试.有什么想法吗?
UPDATE
我只是在踏板上尝试过它并没有用.虽然我们设法使用踏板暂停音乐应用程序.该设备正在运行Cyanogen.录音机也没有在按键上检测到任何东西.需要有关如何检测它的建议:).
UPDATE
随着赏金即将到期,一个小小的更新.@ Nick.T提供的最后一个链接得到了一些有用的信息,但我仍然无法创建一个样本来检测踏板.所以我对标题问题进行了一些小改动,对此方向的任何指导都将非常感谢!
现在,我只想显示一个“按下按钮”!当我在配对的蓝牙耳机(LG HBM-770)上按任意按钮(音量或通话按钮)时出现提示信息。我在这里尝试了确切的方法(这是我正在使用的代码):Android-在BroadcastReceiver上注册耳机按钮单击没有任何运气,包括建议的修复方法。谷歌搜索时间仅指向该类型的代码。清单中启用了蓝牙权限。
如果我现在按通话按钮,它似乎永远不会进入我的应用程序,而是显示菜单,要求您选择处理该应用程序的应用程序(语音搜索,谷歌语音等)。如果我按住蓝牙通话按钮,则手机会拨打上次拨打的电话。如果我尝试用ACTION_POWER_DISCONNECTED替换Intent过滤器类型,则在断开电源时它可以正常工作,因此从那时开始,该代码似乎正常工作。
如果我根本不使用任何过滤器,那会很高兴,只是弹出一个Toast,显示收到的ANY动作的ID,所以我知道手机上的按钮究竟是什么样子。
如何捕获(拦截)长按蓝牙设备呼叫按钮(android)?
我试着花时间System.currentTimeMillis(),而不是用户按下媒体按钮.但回调是在媒体按钮再次上升时执行的action == KeyEvent.ACTION_UP.
我不想在我的解决方案中使用BroadcastReceiver.
这是我的代码:
MediaSession audioSession = new MediaSession(getApplicationContext(), "TAG");
audioSession.setCallback(new MediaSession.Callback() {
@Override
public boolean onMediaButtonEvent(final Intent mediaButtonIntent) {
String intentAction = mediaButtonIntent.getAction();
if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction))
{
KeyEvent event = (KeyEvent)mediaButtonIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (event != null)
{
int action = event.getAction();
if (action == KeyEvent.ACTION_DOWN) {
long stopTimeOfGame_millis = System.currentTimeMillis();
UtilsRG.info("time stopped: " +stopTimeOfGame_millis);
}
if (action == KeyEvent.ACTION_UP) {
long test = System.currentTimeMillis();
UtilsRG.info("time stopped up: " +test);
}
}
}
return super.onMediaButtonEvent(mediaButtonIntent);
}
}); …Run Code Online (Sandbox Code Playgroud)