如何拦截Android中耳机上的按键按下?

时间:2012-01-29 21:08:41

标签: java android broadcastreceiver

我研究了ACTION_MEDIA_BUTTON意图并且我试图使用它并拦截按钮按下并使用吐司将它们呈现在屏幕上。我注册了接收器来拦截两个意图:

  1. ACTION_HEADSET_PLUG - 插入耳机

  2. ACTION_MEDIA_BUTTON - 按下按钮

  3. 这是在我的主要活动中完成的:

            IntentFilter mediaFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
            mediaFilter.setPriority(10000);
            registerReceiver(_receiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG));
            registerReceiver(_receiver, mediaFilter);
    

    这是处理按钮按下的接收器的一部分:

        if (action.equals(Intent.ACTION_HEADSET_PLUG))
        {
            Toast.makeText(context, "earphones activity",Toast.LENGTH_SHORT).show();
            if (intent.getExtras().getInt("state")==1)//if plugged
                Toast.makeText(context, "earphones plugged",Toast.LENGTH_LONG).show();
            else Toast.makeText(context, "earphones un-plugged",Toast.LENGTH_LONG).show();
        }
        else 
        if (action.equals(Intent.ACTION_MEDIA_BUTTON))
        {
            Toast.makeText(context, "button pressed",Toast.LENGTH_LONG).show();
            key=intent.getExtras().getString("EXTRA_KEY_EVENT");
            Toast.makeText(context, key,Toast.LENGTH_LONG).show();
        }
    

    现在处理耳机插件和拆卸的部件工作正常,但截取按钮按下的部件不是。

    有没有理由处理ACTION_MEDIA_BUTTON的代码不起作用?

    我需要特殊许可来拦截这样的意图吗?

    我正在使用三星Galaxy S2测试代码。

    我查看了所有相似的帖子并尝试了一切。不幸的是,似乎没有任何工作。

3 个答案:

答案 0 :(得分:3)

我最近开发了一个响应媒体按钮的应用程序。我在三星Galaxy S II上进行了测试,但它确实有效。

首先,在AndroidManifest.xml<application>区域内,放置以下内容:

<!-- Broadcast Receivers -->
<receiver android:name="net.work.box.controller.receivers.RemoteControlReceiver" >
    <intent-filter android:priority="1000000000000000" >
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>

然后,在另一个文件中创建BroadcastReceiver

public class RemoteControlReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction()) {
            KeyEvent event = (KeyEvent) intent .getParcelableExtra(Intent.EXTRA_KEY_EVENT);

            if (event == null) {
                return;
            }

            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                context.sendBroadcast(new Intent(Intents.ACTION_PLAYER_PAUSE));
            }
        }
    }

}

这可能是最佳解决方案(特别是上面的硬编码android:priority)。然而,它尝试了其他几种技术,但似乎都没有。所以我不得不求助于这个...我希望我帮助过。

答案 1 :(得分:2)

感谢您的贡献。

对于所有在这里苦苦挣扎的人来说,最终的结论是:

经过大量的流泪之后,我终于意识到我可以拦截两种类型的广播:有些像ACTION_HEADSET_PLUG需要在活动代码中注册。

其他像ACTION_MEDIA_BUTTON这样的人需要在清单文件中注册。

在这个拦截两个意图的例子中,我们要求两者兼顾。

在代码和清单文件中设置它。

答案 2 :(得分:0)

if (Intent.ACTION_MEDIA_BUTTON.equals(action)) {
    if (intent.hasExtra(Intent.EXTRA_KEY_EVENT)) {
        String key = intent.getStringExtra(Intent.EXTRA_KEY_EVENT);
        toast("Button "+key+" was pressed");
    } else
        toast("Some button was pressed");
}

此代码返回Toast“按下null按钮”