Обработка мультимедийных кнопок в Android 5.0 Lollipop
До 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.