2012-11-06 84 views
11

目标是最终拦截来自耳机以及蓝牙的广播,以响应来自耳机的不同类型的点击以更改媒体播放器。此解决方案适用于ICS之前的所有版本。下面是一些代码,事情我已经试过的:MediaButtonIntentReceiver无法在Android 4.0及更高版本中工作

.... 
private BroadcastReceiver mediaButtonReceiver = new MediaButtonIntentReceiver(); 
.... 
public void onCreate() { 
    ... 
    IntentFilter mediaFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON); 
    mediaFilter.setPriority(2147483647); // this is bad...I know 
    this.registerReceiver(mediaButtonReceiver, mediaFilter); 
    ... 
} 

public class MediaButtonIntentReceiver extends BroadcastReceiver { 

    private KeyEvent event; 

    public MediaButtonIntentReceiver() { 
     super(); 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String intentAction = intent.getAction(); 
     if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { 
      return; 
     } 
     event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
     if (event == null) { 
      return; 
     } 
     try { 
      int action = event.getAction(); 

      switch(action) { 

       case KeyEvent.ACTION_UP : 
        Log.d("TEST", "BUTTON UP"); 
        break; 
       case KeyEvent.ACTION_DOWN : 
       case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE : 
        Log.d("TEST", "BUTTON DOWN"); 
        break; 
      } 
     } catch (Exception e) { 
      Log.d("TEST", "THIS IS NOT GOOD"); 
     } 
     abortBroadcast(); 
    } 
} 

要尽量使这项工作,这听起来像4.0+需要像这里面没有工作:

((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(new ComponentName(this, MediaButtonIntentReceiver.class)); 

我甚至试过它添加到清单中,除了上面:

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

仍然没有运气。我在这里错过了什么?这当然是一个4.0 +/ICS /果冻豆的问题......这是在一项服务中完成的,而不是一项活动。

+0

我也发现这是Android核心的原因,但没有办法解决它:http://code.google.com/p/media-button-router/issues/detail?id=10#c4 – Du3

回答

10

它看起来像你的广播接收机是你的服务的内部类?如果是这样,让你的广播接收器的静态和在清单中做到这一点:

<receiver android:name="MyOuterClass$MediaButtonIntentReceiver" android:enabled="true"> 
    <intent-filter android:priority="2147483647" > 
     <action android:name="android.intent.action.MEDIA_BUTTON" /> 
    </intent-filter> 
</receiver> 

在Android 3.0以上版本,你必须使用registerMediaButtonEventReceiver注册接收器。这对IntentFilter使用AndroidManifest。它在2.x中工作的原因是因为您注册的是this.registerReceiver(),它在没有AndroidManifest的情况下注册了接收器。

+3

我使用内部类的唯一理由是能够访问外部类的方法,但如果内部类是静态的,我将无法访问这些方法。 [捕捉22](http://stackoverflow.com/questions/15058743/how-do-i-register-in-manifest-an-inner-media-button-broadcastreciver#comment21174031_15058783)。建议? – an00b

+0

@ an00b我们使用Greenrobot的EventBus作为组件间通信的简单方法(http://greenrobot.org/eventbus/documentation/)。例如。静态BroadcastReceiver发布活动订阅的事件。非常适合解耦 –

1

就在这个果冻尝试为我工作:

   broadcastReceiver = new BroadcastReceiver() {//global BroadcastReceiver 
      @Override 
      public void onReceive(Context context, Intent intent) { 

       String action = intent.getAction(); 
       if(action.equals("android.intent.action.MEDIA_BUTTON")){ 
        Log.e("test", "ok"); 
       } 
      }; 

意图:从服务

 IntentFilter intentfilterTime = null; 
     intentfilterTime = new IntentFilter(); 
     intentfilterTime.addAction("android.intent.action.MEDIA_BUTTON"); 
     registerReceiver(broadcastReceiver, intentfilterTime); 

测试与Widgetsoid的媒体按钮(谁模仿BT媒体按钮)。所有工作。

+0

当我按住媒体按钮时,Google应用程序仍然会将其结束。我甚至为这个意图添加了最大的优先权。我在onCreate函数中添加了代码的snippit。是否还有其他需要定义的地方,例如关于意图的清单?就像我说的,这对于4.0之前的版本可以正常工作Android – Du3

+0

您是否在真实设备上测试过?或模拟器?我的代码不适合你?使用android 4.2在星系连线上造成我的工作。通常意图是在清单或代码中,就像我给你的,但没有其他地方。 – jaumard

+0

使用4.1.1在Galaxy S3上测试。我已经尝试了以上所有内容。你的代码在2.3.6上工作 – Du3

相关问题