BroadcastReceiver for ACTION_MEDIA_BUTTON无效

时间:2012-04-16 15:49:38

标签: java android android-intent broadcastreceiver

我正在为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");
                }
            }

        }
    };
    registerReceiver(brMediaButton, mediaButtonFilter);

所有我真正需要测试的是KEYCODE_HEADSETHOOK,但是将其他代码用于测试并没有什么坏处,我会在一切正常工作后修复它。

在我的清单中:

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

我原本以为这可能是权限问题,因为我没有为此指定任何权限,但是我没有收到任何错误消息。

就像我之前说的那样,我尝试了很多这方面的变化。一个例子是使用此链接broadcastreceiver onReceive problem ACTION_MEDIA_BUTTON Android上的代码与CommonsWare的更正。但是,我再次对它进行了修改,使其不是单独的类。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:11)

我在搭载Android 4.4.2的三星Galaxy S5上进行了测试。那么什么是重要的,在其他帖子中没有提到

  • 应用程序标记内的 AndroidManifest.xml 中注册接收者,但在每个活动标记之外注册。
  • 您的接收方 Broadcastreceiver 需要公开且静态
  • 一项活动需要注册 MediaButtonEventReceiver 以收听按键

好的,这里有一些示例代码

mAudioManager =  (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mReceiverComponent = new ComponentName(this,YourBroadcastReceiver.class);
...
mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent);
...
// somewhere else
mAudioManager.unregisterMediaButtonEventReceiver(mReceiverComponent);

接收器

public static class YourBroadcastReceiver extends BroadcastReceiver{

    // Constructor is mandatory
    public MediaBroadcastReceiver ()
    {
        super ();
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        String intentAction = intent.getAction();
        Log.i (TAG_MEDIA, intentAction.toString() + " happended");
        if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
            Log.i (TAG_MEDIA, "no media button information");
            return;
        }
        KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
        if (event == null) {
            Log.i (TAG_MEDIA, "no keypress");
            return;
        }
        // other stuff you want to do
    }
}

这里是清单代码段。如果需要,为intent-filter添加优先级,但我不需要:

<application>
    <receiver android:name="OuterClass$YourBroadcastReceiver">
        <intent-filter>
           <action android:name="android.intent.action.MEDIA_BUTTON" />
         </intent-filter>
    </receiver>
    <activity> ... </activity>
</application>

参考文献:

答案 1 :(得分:4)

mediaButtonReceiver = new ComponentName(getPackageName(), MediaButtonReceiver.class.getName());

mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

mAudioManager.registerMediaButtonEventReceiver(mediaButtonReceiver);

此代码会将您的耳机按钮绑定到您的应用和应用,直到您致电:

mAudioManager.unregisterMediaButtonEventReceiver(mediaButtonReceiver);

答案 2 :(得分:1)

您可以使用此处所述的MediaSession避免使用适用于Android的Broacastreceiver&gt; 5.0(API级别21 LOLLIPOP):https://stackoverflow.com/a/39413753/1386969