2014-11-18 4 views
11

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

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); 

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

+0

Вы настроили сеанс активным? 'session.setActive (true)' –

+0

См. пример кода. Последняя строка - 'session.setActive (true);' – tvkanters

+1

У меня точно такая же проблема, о которой вы сообщали. Я также попытался использовать ваш фрагмент кода с MediaSessionCompat (из поддержки V4), но без успеха. Я продолжу свое расследование, и если я найду какое-то решение, я отправлю в качестве ответа здесь. – Luis

ответ

18

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

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

  2. набор MediaSession.FLAG_HANDLES_MEDIA_BUTTONS и MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS флаги

  3. набор mediaSession к активному

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

    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.

+0

Это сработало для меня, спасибо. Он работает не только при получении вызова. Я пробовал обходной путь, создавая представление, которое всегда будет наверху, когда звонок активен, но он тоже не работает (в версиях до Android L в режиме просмотра). – Luis

+0

@ Луис, я смущен тем, что вы имеете в виду, получив звонок. Вы имеете в виду использование аппаратных кнопок для ответа на вызов или приостановку воспроизведения музыки при поступлении вызова? – mangini

+0

На самом деле, в моем случае, я хочу переопределять действия по умолчанию Android по своим пользовательским действиям все время. Так, например, я хочу установить один клик, чтобы увеличить объем системы. В текущей реализации, если устройство играет музыку или нет, я могу перехватить щелчок гарнитуры и принять мои действия вместо действия по умолчанию для Android (play/pause). Но когда пользователь с текущим вызовом, MediaSession не может перехватить щелчок гарнитуры, приложение вызова имеет более высокий приоритет, а затем принимает свое действие вместо моего пользовательского действия. – Luis

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