广播接收器用于ACTION_MEDIA_BUTTON不工作广播接收器用于ACTION_MEDIA_B

2019-05-13 12:49发布

我写的版本4.0.3(ICS)Android操作系统的Android应用程序。 问题是,我没有收到从我在广播接收器的的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问题ACTION_MEDIA_BUTTON的Android与CommonsWare的更正。 然而,同样,我修改了它,所以它不是一个独立的类。

预先感谢您的帮助。

Answer 1:

我用的是Android 4.4.2测试这对三星Galaxy S5。 那么,什么是重要的,什么是不能在其他帖子中提到

  • 注册应用程序标签内而外,从每一个活动标签在AndroidManifest.xml接收器。
  • 您接收广播接收器需要是公共的和静态
  • 一个活动需要注册一个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
    }
}

这里的清单片段。 如果需要添加优先级的意图过滤器,但没有必要对我来说:

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

对于参考文献:

  • http://developer.android.com/training/managing-audio/volume-playback.html
  • MediaButtonIntentReceiver不是在Android平台4.0+
  • 广播接收器:不能实例类; 没有空的构造


Answer 2:

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

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

mAudioManager.registerMediaButtonEventReceiver(mediaButtonReceiver);

此代码将您的耳机按钮绑定到你的应用程序只有等到你打电话给你的应用程序:

mAudioManager.unregisterMediaButtonEventReceiver(mediaButtonReceiver);


Answer 3:

你能避免使用Broacastreceiver使用这里所描述的MediaSession的Android> 5.0(API级别21 LOLLIPOP): https://stackoverflow.com/a/39413753/1386969



文章来源: BroadcastReceiver for ACTION_MEDIA_BUTTON not working