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

objective состоит в том, чтобы перехватить трансляции с гарнитуры, а также, в конечном счете, 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)); 

Я даже попытался добавить его в манифест, в дополнение к вышесказанному:

       

Еще не повезло. Что мне здесь не хватает? Это, безусловно, проблема 4.0 + / ICS / JellyBean … Это делается в службе, а не в действии.

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

      

В 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"); } }; 

objective:

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

Тест со службы с помощью кнопки мультимедиа Widgetsoid (которые эмулируют кнопки мультимедиа BT). Все работает.

Interesting Posts

Объединить диск c: и d: пока диск D: имеет программные файлы

Hibernate – пакетное обновление возвращало неожиданный счетчик строк из обновления: 0 фактическое количество строк: 0 ожидаемых: 1

Как распознать салфетки во всех четырех направлениях?

C ++ 11 обратный диапазон для цикла

Ноутбук под управлением Windows 7 постоянно терял связь

Почему Notepad ++ отключает плагин HexEditor?

В чем разница между Unix и Linux?

разница между абстракцией и инкапсуляцией?

Есть ли инструмент управления батареей Acer, который ограничивает заряд батареи? Должен ли я даже беспокоиться?

Что мне делать против версии CUDA драйвера недостаточно для версии исполнения CUDA?

Почему “ “ лучше, чем `подмножество`?

Должны ли мы обычно использовать float-литералы для поплавков вместо простых двойных литералов?

Адаптивная скользящая средняя – верхняя производительность в R

Отключить расширения режима разработчика в Chrome

MediaPlayer setDataSource, лучше использовать путь или FileDescriptor?

Давайте будем гением компьютера.