2012-11-06 111 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

相關問題