Управление медиа-кнопками в Android 5.0 Lollipop

Pre API 21 Я использовал вызов типа audioManager.registerMediaButtonEventReceiver(receiver); для обработки событий мультимедийных кнопок, когда пользователь нажал кнопку на своей гарнитуре. Что касается API 21, кажется, что следует использовать MediaSession. Однако я не получаю никакого ответа.

final MediaSession session = new MediaSession(context, "TAG");
session.setCallback(new Callback() {
    @Override
    public boolean onMediaButtonEvent(final Intent mediaButtonIntent) {
        Log.i("TAG", "GOT EVENT");
        return super.onMediaButtonEvent(mediaButtonIntent);
    }
});

session.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS |
        MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);

session.setActive(true);

Над тем, что я думаю, должно работать, но нет. Кто-нибудь знает, почему это не работает или как я должен зарегистрироваться?

Ответ 1

Чтобы получать события с медиа-кнопками, вам необходимо:

  • установить MediaSession.Callback и обработать соответствующие события (*)

  • установить MediaSession.FLAG_HANDLES_MEDIA_BUTTONS и MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS флаги

  • установите mediaSession в активную

  • правильно настройте состояние воспроизведения в специальных действиях (событиях воспроизведения), которые обрабатывает ваш сеанс. Например:

    PlaybackState state = new PlaybackState.Builder()
            .setActions(
                    PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PLAY_PAUSE |
                    PlaybackState.ACTION_PLAY_FROM_MEDIA_ID | PlaybackState.ACTION_PAUSE |
                    PlaybackState.ACTION_SKIP_TO_NEXT | PlaybackState.ACTION_SKIP_TO_PREVIOUS)
            .setState(PlaybackState.STATE_PLAYING, position, speed, SystemClock.elapsedRealtime())
            .build();
    mSession.setPlaybackState(state);
    

Я предполагаю, что вам не хватает # 4, потому что вы все делаете правильно.

(*) стандартная реализация Callback.onMediaButtonEvent обрабатывает все обычные медиа-кнопки и вызывает соответствующие методы onXXXX() (onPlay, onPause, onSkipToNext и т.д.). Если вам не нужно обращаться с необычными медиа-кнопками - или для целей отладки - вам не нужно переопределять onMediaButtonEvent.