BroadcastReceiver для ACTION_MEDIA_BUTTON не работает

Я пишу приложение Android для версии 4.0.3 (ICS) ОС Android. Проблема в том, что я не получаю вывод из своего Log.d () в методе onReceive () BroadcastReceiver, что означает, что мое приложение неправильно обрабатывает трансляцию.

Я прочитал бесчисленные вопросы о том, как запускать код при нажатии ACTION_MEDIA_BUTTON. Я даже копировал + вставлял код, когда мой не работал, просто чтобы посмотреть, будет ли это работать.

ACTION_MEDIA_BUTTON Я хочу обрабатывать одну кнопку на наушниках, которая позволяет пользователю выбирать / завершать вызовы, воспроизводить / приостанавливать музыку. Вместо того, чтобы мое приложение обрабатывало эту кнопку, когда я нажимаю на нее, музыкальный плеер на моем Nexus S Android начинает играть песню .

Я не поместил свой код в другой класс, может быть, поэтому он не работает?

Вот код, найденный в методе onCreate () (этот код, который я скопировал с веб-сайта после того, как код, который я написал, не работал):

IntentFilter mediaButtonFilter = new IntentFilter( Intent.ACTION_MEDIA_BUTTON); mediaButtonFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); BroadcastReceiver brMediaButton = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { Log.d("Event", "Media button!"); this.abortBroadcast(); KeyEvent key = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); if(key.getAction() == KeyEvent.ACTION_UP) { int keycode = key.getKeyCode(); if(keycode == KeyEvent.KEYCODE_MEDIA_NEXT) { Log.d("TestApp", "Next Pressed"); } else if(keycode == KeyEvent.KEYCODE_MEDIA_PREVIOUS) { Log.d("TestApp", "Previous pressed"); } else if(keycode == KeyEvent.KEYCODE_HEADSETHOOK) { Log.d("TestApp", "Head Set Hook pressed"); } } } }; registerReceiver(brMediaButton, mediaButtonFilter); 

Все, что мне действительно нужно проверить, это KEYCODE_HEADSETHOOK, но мне не больно иметь другой код для тестирования, я исправлю его, как только я смогу заставить все работать правильно.

В моем манифесте:

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

Я изначально думал, что это может быть проблема с правами доступа, поскольку я не указал никаких разрешений для этого, однако я не получил сообщения об ошибке.

Как я уже говорил, я пробовал много вариантов этого. Одним из примеров было использование кода на этом канале передачи радиопередатчика onReceive проблемы ACTION_MEDIA_BUTTON Android с исправлениями CommonsWare. Опять же, я изменил его, чтобы он не был в отдельном классе.

Спасибо заранее за вашу помощь.

Solutions Collecting From Web of "BroadcastReceiver для ACTION_MEDIA_BUTTON не работает"

Я тестировал это на Samsung Galaxy S5 с Android 4.4.2. Итак, что важно и что не упоминается в других сообщениях :

  • Зарегистрируйте приемник в AndroidManifest.xml внутри тега приложения, но вне его.
  • Ваш приемник Broadcastreceiver должен быть общедоступным и статическим
  • Одному из действий необходимо зарегистрировать MediaButtonEventReceiver для прослушивания нажатия кнопок

Хорошо, и вот пример кода :

 mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); mReceiverComponent = new ComponentName(this,YourBroadcastReceiver.class); ... mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent); ... // somewhere else mAudioManager.unregisterMediaButtonEventReceiver(mReceiverComponent); 

Здесь приемник :

 public static class YourBroadcastReceiver extends BroadcastReceiver{ // Constructor is mandatory public MediaBroadcastReceiver () { super (); } @Override public void onReceive(Context context, Intent intent) { String intentAction = intent.getAction(); Log.i (TAG_MEDIA, intentAction.toString() + " happended"); if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { Log.i (TAG_MEDIA, "no media button information"); return; } KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); if (event == null) { Log.i (TAG_MEDIA, "no keypress"); return; } // other stuff you want to do } } 

И вот явный фрагмент. При необходимости добавьте приоритет для фильтра намерения, но мне не нужен:

 <application> <receiver android:name="OuterClass$YourBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> </receiver> <activity> ... </activity> </application> 

Для ссылок:

 mediaButtonReceiver = new ComponentName(getPackageName(), MediaButtonReceiver.class.getName()); mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); mAudioManager.registerMediaButtonEventReceiver(mediaButatonReceiver); 

Этот код свяжет вашу кнопку наушников с вашим приложением и вашим приложением только до тех пор, пока вы не вызовете:

 mAudioManager.unregisterMediaButtonEventReceiver(mediaButatonReceiver); 

Вы можете избежать использования Broacastreceiver для Android> 5.0 (API уровня 21 LOLLIPOP) с помощью описанной здесь MediaSession: https://stackoverflow.com/a/39413753/1386969