Широковещательный приемник с наивысшим приоритетом не работает

Я делаю приложение, используя обработчик ACTION_MEDIA_BUTTON, но, похоже, оно всегда перехватывается MX Player или Apollo, и я не получаю Intent

Я пробовал как приоритет 1000, так и 2147483647, установленный в теге, и сразу после конструктора с помощью setPriority.

Приложения работают, когда нет MX Player или Apollo

Я также пробовал использовать приложение Headset Interceptor из google play, я пытался запретить события в MX Player с помощью приложения Autostarts - ничего не помогает.

в 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>

person Max The Cat    schedule 11.09.2013    source источник
comment
Пример кода был бы полезен.   -  person Egor    schedule 11.09.2013
comment
добавлены образцы кода, но они довольно стандартны   -  person Max The Cat    schedule 11.09.2013
comment
Пожалуйста, используйте android:priority="999" или меньше; SYSTEM_HIGH_PRIORITY Constant Value: 1000 Applications should never use filters with this or higher priorities.   -  person Benny    schedule 16.10.2017


Ответы (4)


Обратитесь к строке «Значение должно быть больше -1000 и меньше 1000.» по ссылке ниже, наивысший приоритет — 999, а не 1000.

http://developer.android.com/guide/topics/manifest/intent-filter-element.html

person Vipin Sharma    schedule 26.12.2014
comment
Этой формулировки больше нет в документации. - person CamHart; 18.05.2019
comment
@CamHart См. это: developer.android.com/reference/android/content / Постоянное значение для этого — 1000, а также говорит, что приложения никогда не должны использовать фильтры с этим или более высоким приоритетом. Таким образом, формулировки могли измениться, но ограничение составляет только от -999 до 999. - person Sandip Fichadiya; 29.06.2019

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

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

Используйте 1_

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

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

person Raghav Pete    schedule 15.05.2016

Чтобы захватить кнопку гарнитуры, необходимо также зарегистрировать приемник в медиа в onCreate в Activity.

AudioManager manager = (AudioManager) getSystemService(AUDIO_SERVICE);
manager.registerMediaButtonEventReceiver(new ComponentName(getPackageName(), BCreceiver.class.getName()));
person Max The Cat    schedule 11.09.2013
comment
registerMediaButtonEventReceiver устарел. В документах говорится, что вместо этого следует использовать MediaSession.setMediaButtonReceiver(). - person Grahambo; 06.10.2015
comment
чтобы уточнить мой предыдущий комментарий, registerMediaButtonEventReceiver() устарел только с версии v21. - person Grahambo; 06.10.2015

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

person Egor    schedule 11.09.2013
comment
Когда я отключаю IntentFilter в onCreate и оставляю только манифест, он перестает вызываться даже для HEADSET_PLUG (ранее это вызывалось нормально) - person Max The Cat; 11.09.2013
comment
Также обратите внимание, что он РАБОТАЕТ без MX Player и всегда перехватывает HEADSET_PLUG независимо от наличия MX Player. - person Max The Cat; 11.09.2013
comment
@MaxTheCat, после небольшого исследования я обнаружил, что при некоторых обстоятельствах действительно может иметь место потребление вещания. Если широковещательная рассылка упорядочена и оба приложения-потребителя установили наивысший приоритет для получения этой широковещательной рассылки, то они получат ее в произвольном порядке. Затем можно прерватьBroadcast(), сделав его недоступным для других. Так что это, вероятно, то, что происходит, и я не могу придумать, как вы можете решить эту проблему. - person Egor; 11.09.2013