2013-09-11 3 views
6

Я делаю приложения с помощью обработчика ACTION_MEDIA_BUTTON, но это, кажется, что всегда перехвачен MX-плеер или Apollo, и я не получаю IntentBroadcast приемник наивысший приоритет не работает

Я попытался как 1000 и 2147483647 приоритет набор в теге и непосредственно после конструкторы с SetPriority

приложения работает, когда нет MX-плеера или Apollo присутствует

Я также попытался с помощью гарнитуры перехватчик приложения из Google Play, я пытался отрицать события в MX-плеер с приложением автозапуска - ничего не помогает

в OnCreate:

IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON); 
filter.addAction(Intent.ACTION_HEADSET_PLUG); 
filter.setPriority(1000); 
registerReceiver(receiver, filter); 

в приемник

@Override 
public void onReceive(Context context, Intent intent) { 
    if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { 
     // NEVER REACHES HERE WHEN MX PLAYER PRESENT. WORKS IF NOT 

манифеста

<receiver 
    android:name="BCreceiver" 
    android:enabled="true"> 
    <intent-filter android:priority="1000"> 
     <action android:name="android.intent.action.MEDIA_BUTTON" /> 
     <action android:name="android.intent.action.HEADSET_PLUG" /> 
    </intent-filter> 
</receiver> 
+0

Образец кода был бы полезен. – Egor

+0

добавлены образцы кода, но они довольно стандартные –

+0

Пожалуйста, используйте 'android: priority =" 999 "' или меньше; 'SYSTEM_HIGH_PRIORITY'' Постоянное значение: 1000' 'Приложения никогда не должны использовать фильтры с такими или более приоритетными приоритетами.' – Benny

ответ

1

Для захвата кнопку гарнитуры следует зарегистрировать приемник в средствах массовой информации тоже в OnCreate в деятельности

AudioManager manager = (AudioManager) getSystemService(AUDIO_SERVICE); 
manager.registerMediaButtonEventReceiver(new ComponentName(getPackageName(), BCreceiver.class.getName())); 
+0

registerMediaButtonEventReceiver устарел. Документы говорят, что вместо этого использовать MediaSession.setMediaButtonReceiver(). – Grahambo

+0

, чтобы уточнить мой предыдущий комментарий, registerMediaButtonEventReceiver() был устаревшим только с v21. – Grahambo

1

Прежде всего, вы не должны зарегистрировать приемник в коде, если он уже упоминается в манифест. Тогда имя получателя недействительно, оно должно быть либо полным именем класса, либо сокращением, которое будет добавлено к имени пакета приложения. В случае, если BCreceiver находится в основном пакете, значение атрибута должно быть ".BCreceiver". Последнее упоминание о том, что вы не должны менять приоритет, нет такой вещи, как перехват трансляции на Android (насколько я знаю), поэтому все BroadcastReceivers, подписавшиеся на какое-либо действие, получат трансляцию при ее запуске. Попробуйте эти исправления и обновите свой вопрос.

+0

Когда я отключу IntentFilter в onCreate и оставляю манифест, он перестает быть вызванным даже для HEADSET_PLUG (который раньше назывался ok) –

+0

I 'Пробовал как полное имя класса &.BCreceiver –

+0

Также обратите внимание, что он РАБОТАЕТ без MX Player и всегда перехватывает HEADSET_PLUG независимо от присутствия MX Player. –

2

Даже хотя это немного старый вопрос, я добавляю мои выводы, так что это поможет новым посетителям.

Для получения Intent.ACTION_MEDIA_BUTTON вещания с использованием кода не требуется. Документация говорит, что намерение должно быть зарегистрировано в манифесте. Не удалось заставить его работать от регистрации из кода.

Использование registerMediaButtonEventReceiver

Установка приоритета в манифесте android:priority="<int value>" работ. Я использовал 2147483647 и даже смог переопределить игрока. Я читаю, что winamp использует наивысший приоритет.

Надеюсь, это поможет.

Смежные вопросы