【问题标题】:BroadcastReceiver for ACTION_MEDIA_BUTTON not workingACTION_MEDIA_BUTTON 的广播接收器不起作用
【发布时间】:2012-04-16 15:49:37
【问题描述】:

我正在为 Android 操作系统的 4.0.3 (ICS) 版本编写一个 Android 应用程序。问题是我在 BroadcastReceiver 的 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 的更正。但是,我再次对其进行了修改,使其不在单独的类中。

提前感谢您的帮助。

【问题讨论】:

  • 请检查thisthis 希望这能解决您的问题
  • 我的代码几乎和你一样,它在 Android 2.2 / 2.3 上运行良好。但像你一样,我无法让它与 ICS 一起使用......
  • 这里也一样。它适用于 Android 4.0 之前。 API 发生了变化。
  • 我在同一问题上开始了赏金我认为...stackoverflow.com/questions/13257982/…

标签: java android android-intent broadcastreceiver


【解决方案1】:

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

  • application标签内的AndroidManifest.xml中注册接收器,但在每个activity标签之外。
  • 您的接收器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
    }
}

这里是清单 sn-p。如果需要,为意图过滤器添加优先级,但我不需要:

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

供参考:

【讨论】:

  • 当我的活动进入后台 onReceive() 总是调用但在 nexus onReceive() 中从未在后台调用时,我试图在三星设备中实现相同的功能。你能解释一下为什么吗?
【解决方案2】:
mediaButtonReceiver = new ComponentName(getPackageName(), MediaButtonReceiver.class.getName());

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

mAudioManager.registerMediaButtonEventReceiver(mediaButtonReceiver);

此代码会将您的耳机按钮绑定到您的应用,并且仅在您调用之前:

mAudioManager.unregisterMediaButtonEventReceiver(mediaButtonReceiver);

【讨论】:

  • 或者直到其他应用调用registerMediaButtonEventReceiver(),我会这样做;)
  • 我可以在哪里注册广播。我只在 Manifest 文件中注册了 Receiver
【解决方案3】:

您可以通过此处描述的 MediaSession 避免使用适用于 Android >5.0(API 级别 21 LOLLIPOP)的广播接收器:https://stackoverflow.com/a/39413753/1386969

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2017-10-12
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    相关资源
    最近更新 更多