广播接收器最高优先级不工作

时间:2013-09-11 06:47:52

标签: android android-intent broadcast headset

我正在使用ACTION_MEDIA_BUTTON处理程序进行应用程序,但看起来它总是被MX Player或Apollo拦截而我没有意图

我已尝试在标记中设置1000和2147483647优先级,并在构造函数后直接使用setPriority

当没有MX Player或Apollo存在时,应用程序可以运行

我也试过使用谷歌播放的Headset Interceptor应用程序,我试图用自动启动应用程序拒绝事件到MX Player - 没什么帮助

在onCreate中

IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
filter.addAction(Intent.ACTION_HEADSET_PLUG);
filter.setPriority(1000);
registerReceiver(receiver, filter);

在Receiver中

@Override
public void onReceive(Context context, Intent intent) {
    if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
        // NEVER REACHES HERE WHEN MX PLAYER PRESENT. WORKS IF NOT
清单中的

<receiver
    android:name="BCreceiver"
    android:enabled="true">
    <intent-filter android:priority="1000">
        <action android:name="android.intent.action.MEDIA_BUTTON" />
        <action android:name="android.intent.action.HEADSET_PLUG" />
    </intent-filter>
</receiver>

4 个答案:

答案 0 :(得分:13)

请参阅以下链接中的“值必须大于-1000且小于1000。”,最高优先级为999而不是1000.

http://developer.android.com/guide/topics/manifest/intent-filter-element.html

答案 1 :(得分:2)

尽管这是一个有点老问题,但我正在添加我的发现,以便它可以帮助新访问者。

要接收Intent.ACTION_MEDIA_BUTTON,不需要从代码广播注册意图。文档说明意图必须在清单中注册。无法通过代码注册来实现它。

使用registerMediaButtonEventReceiver

在清单android:priority="<int value>"中设置优先级有效。我使用了2147483647甚至能够覆盖股票播放器。我看到winamp正在使用最高优先级。

希望这有帮助。

答案 2 :(得分:1)

首先,如果清单中已经提到过,那么您不应该在代码中注册接收器。然后,接收者的名称无效,它应该是完整的类名,或者是速记,它将附加到应用程序包名称。如果BCreceiver位于主包中,则属性值应为".BCreceiver"。最后提到的是你不应该真正改变优先级,没有拦截Android中的广播(据我所知),所以订阅动作的所有BroadcastReceivers都会在被解雇时收到广播。尝试这些修补程序并更新您的问题。

答案 3 :(得分:1)

要捕获耳机按钮,应在onCreate in Activity

中注册接收器
AudioManager manager = (AudioManager) getSystemService(AUDIO_SERVICE);
manager.registerMediaButtonEventReceiver(new ComponentName(getPackageName(), BCreceiver.class.getName()));