MediaButtonIntentReceiver не работает в Android 4.0+

Цель состоит в том, чтобы перехватить трансляции с гарнитуры, а также, в конечном счете, bluetooth, чтобы реагировать на различные типы кликов от гарнитуры, чтобы изменить медиаплеер. Это решение отлично подходит для всех версий до ICS. Вот некоторые из кода и вещей, которые я пробовал:

.... 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 / JellyBean … Это делается в службе, а не в действии.

Solutions Collecting From Web of "MediaButtonIntentReceiver не работает в Android 4.0+"

Похоже, ваш вещательный приемник является внутренним классом для вашего обслуживания? Если да, сделайте свой вещательный приемник статичным и в манифесте сделайте так:

 <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 для регистрации получателя. Это использует AndroidManifest для IntentFilter. Причина, по которой она работает в 2.x, this.registerReceiver() с this.registerReceiver() что вы регистрировали ее с помощью this.registerReceiver() который зарегистрировал приемник без AndroidManifest.

Просто попробуйте на желе, это работает на меня:

  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). Все работает.