Кнопка захвата мультимедиа на Android> = 4.0 (работает на 2.3)

Я написал какой-то сервис, который использует BroadcastReceiver для захвата одной из мультимедийных кнопок («кнопка воспроизведения» с гарнитуры), и он отлично работает на Android 2.3.x (HTC Nexus One или HTC Desire)

Когда я пытался запустить на Android 4.0.3 (Samsung Nexus S), он не работал (мое приложение не получает намерений "android.intent.action.MEDIA_BUTTON" и кнопка "играть" работает как обычно: останавливается / начинает музыку).

Содержание манифеста:

<code>...
<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <receiver android:name=".buttonreceiver.MediaButtonIntentReceiver" >
        <intent-filter android:priority="10000" >
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </receiver>
...
</code>

Есть ли способ заставить его работать на Android 4.0.3

изменить: я пробовал предлагаемое решение, я добавил действие и запустил его, но мой получатель по-прежнему не получает намерения. Что еще более странно, регистрация получателя по коду также не работает:

<code>@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.about_and_activation_view);

    Log.d("MR", "onCreate - " + getIntent().getAction());

    mReceiver = new MediaButtonIntentReceiver();
    registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_MEDIA_BUTTON));
}
</code>

Теперь я в полном замешательстве.

 William15 нояб. 2015 г., 10:11
Также обратите внимание, что приоритет намерения должен быть больше -1000 и меньше 1000.

Ответы на вопрос(2)

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

Добавьте это в файл манифеста (в узле «Приложение»):

    <receiver android:name="BroadcastReceiver">
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
</receiver>

Добавьте это к onCreate () в основном действии или в любое другое место, которое вызывается при запуске приложения. Также может быть полезно в событии onResume ():

    mAudioManager =  (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
    mRemoteControlResponder = new ComponentName(getActivity().getPackageName(), BroadcastReceiver.class.getCanonicalName());

    mAudioManager.registerMediaButtonEventReceiver(mRemoteControlResponder);
Решение Вопроса

Убедитесь, что в вашем приложении есть действие, и что пользователь запускает это действие, прежде чем пытаться нажать эту кнопку. До тех пор, ваш<receiver> не будет получать никаких трансляций.

UPDATE

На Android 4.0 и выше, кажется, что вам также нужно позвонитьregisterMediaButtonEventReceiver() on AudioManager для того, чтобы получить события. Это состояние будет держаться, пока что-то еще не вызоветregisterMediaButtonEventReceiver() или пока вы не позвонитеunregisterMediaButtonEventReceiver().

Например, такая деятельность:

public class MediaButtonActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(new ComponentName(
                                                                                                       this,
                                                                                                       MediaButtonReceiver.class));
  }
}

включит манифест-зарегистрированMediaButtonReceiver чтобы получить события ACTION_MEDIA_BUTTON.

 Marek R11 мая 2012 г., 14:08
Спасибо, наконец, более или менее это работает.
 Marek R11 мая 2012 г., 11:49
Это не сработало. Я имею в виду, что я добавил Activity и запустил ее, но все еще не могу перехватить android.intent.action.MEDIA_BUTTON & quot; даже когда Activity работает, мой получатель действительно получил это намерение.
 Marek R10 мая 2012 г., 22:48
Я получил только услугу, которая запускает распознавание речи и отправляет некоторые другие данные. Это хорошо работает на Android 2.3.x. Это единственное возможное исправление? Активное выполнение требует активного экрана для получения намерений, и это не приемлемо для меня ..
 11 мая 2012 г., 13:32
@MarekR: ОК, я нашел проблему - смотрите обновленный ответ.
 10 мая 2012 г., 22:54
@MarekR: & quot; это единственно возможное исправление? & Quot; - да, хотя я подозреваю, что вы не поняли, исправить. Они не должны оставлять деятельность запущенной. Им просто нужно один раз вручную запустить ваше действие, чтобы вывести ваше приложение из этого остановленного состояния. Пожалуйста, прочитайте ссылку на блог в моем ответе.

Ваш ответ на вопрос