如何在安卓系统中拦截耳机上的按钮按下?

2022-09-04 23:04:23

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

  1. ACTION_HEADSET_PLUG- 插入耳机

  2. ACTION_MEDIA_BUTTON- 接收按钮按下

这是我的主要活动完成的:

        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来测试代码。

我已经看过所有类似的帖子并尝试了一切。不幸的是,似乎没有任何效果。


答案 1

我最近开发了一个响应媒体按钮的应用程序。我在三星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


答案 2

感谢您的贡献。

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

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

其他类似文件需要在清单文件中注册。ACTION_MEDIA_BUTTON

在此示例中,为了拦截这两种意图,我们需要同时执行这两种操作。

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


推荐