Приложение не становится предпочтительным MediaButtonReceiver при повторном вызове setActive(true)
Я пытался реализовать управление мультимедийными кнопками в разговоре Google
Я установил приемник в манифесте:
<receiver android:name="android.support.v4.media.session.MediaButtonReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
<service android:name=".player.PlayFileService">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</service>
создать MediaSessionCompat
в onCreate()
обслуживания:
mediaSession = new MediaSessionCompat(getApplicationContext(), "SOUNDPROCESS");
mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
PlaybackStateCompat ps = new PlaybackStateCompat.Builder()
.setActions(PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_PAUSE | PlaybackStateCompat.ACTION_PLAY_PAUSE)
.build();
mediaSession.setPlaybackState(ps);
mediaSession.setCallback(new MediaSessionCompat.Callback() {
@Override
public void onPlay() { ...
}
});
и обрабатывать намерение в onStartCommand()
MediaButtonReceiver.handleIntent(mediaSession, intent);
Я тогда звоню setActive(true);
когда я получаю аудио фокус, и setActive(false);
когда я прекращаю воспроизведение. Это работает в первый раз, мое приложение становится предпочтительным приемником мультимедийных кнопок и получает обратные вызовы.
Однако, если я остановлю воспроизведение в своем приложении, перейдите в другое приложение, такое как Google Play Music, и начните воспроизведение там, затем вернитесь в мое приложение и вызовите setActive(true)
Google Play Music продолжает получать обратный вызов, а мультимедийные кнопки не работают в моем приложении.
Насколько я понимаю, последний звонок setActive(true)
должен иметь приоритет. Я подтвердил, что isActive()
возвращает истину. Я также могу обойти эту проблему, создав новый MediaSessionCompat
каждый раз, но это не кажется идеальным.
Как сделать так, чтобы мое приложение становилось предпочтительным приемником мультимедийных кнопок при каждом вызове? setActive(true)
?
ОБНОВЛЕНИЕ: минимальный проект для воспроизведения проблемы здесь: https://github.com/svenoaks/MediaButtonDemo.git
Действия по воспроизведению:
- Запустите приложение, нажмите кнопку PLAY.
setActive(true)
вызывается, и MediaButtonReceiver теперь является предпочтительной мультимедийной кнопкой. - Нажмите кнопку воспроизведения / паузы на проводных или беспроводных наушниках или другую мультимедийную кнопку. Тост показывает, что обратный вызов работает.
- Начните воспроизведение в другом приложении, например в Google Play Music, которое поддерживает мультимедийные кнопки. Нажмите паузу в этом приложении.
- Демонстрационное приложение больше не может быть предпочтительным приемником медиа-кнопки, даже если кнопка PLAY нажата снова, вызывая
setActive(true)
снова. Другое приложение всегда реагирует на кнопки мультимедиа.
Это было проверено на Android 6.0.
2 ответа
Ключ к правильной работе - правильно установить PlaybackState
каждый раз, когда ваше приложение начинает воспроизводиться или приостанавливается (что следует делать, когда другое приложение получает аудио сеанс и активирует свой собственный MediaSession
, Без этого проблема, как указано выше, произойдет. Кроме того, для Android 4.4 и ниже, FLAG_HANDLES_TRANSPORT_CONTROLS
должен быть установлен, или же возникнет та же проблема.
Мои наблюдения: (Не хватает репутации, чтобы комментировать, извинения, но я могу ответить на комментарии к этому ответу)
Запустите приложение, нажмите кнопку PLAY. Вызывается setActive(true), а MediaButtonReceiver теперь является предпочтительной мультимедийной кнопкой ': потому что Android сначала отправляет события мультимедийной кнопки на активность переднего плана.
"Начать воспроизведение в другом приложении....... Нажмите pause в этом приложении........, затем вернитесь в мое приложение и вызовите setActive(true)":
a) если вы вызывали прослушиватель onStop перед воспроизведением музыки GooglePlay, то при нажатии любой мультимедийной кнопки ваш мультимедийный сеанс не будет активным (до повторного вызова onPlay), поэтому воспроизводится текущий сеанс, который называется Google Play.
б) Если вы не вызывали onStop, то есть 2 активных сеанса (первый сеанс вашего приложения и первый сеанс Google Play. Второй сеанс не будет вызван, если OnPlay снова не вызывается). Согласно документации, если существует несколько активных медиа-сессий, Android пытается выбрать медиа-сессию, которая готовится к воспроизведению (буферизация / подключение), воспроизведению или приостановке, а не остановленной. ' Таким образом, GooglePlay является последним активным сеансом с приостановленным состоянием и воспроизводится.
c) Если вы вызывали onStop (таким образом, setActive(false)), и если GooglePlay Music также имел setActive(false), и вы не нажимали снова на PlayPlay, то в этом случае также будет воспроизводиться GooglePlay Music, так как "Если нет активной сессии Android пытается отправить событие в последний активный сеанс. В Android 5.0 (уровень API 21) или более поздней версии событие отправляется только в сеансы, которые вызвали setMediaButtonReceiver()."
Вы установили MediaButtonReceiver ()?
https://developer.android.com/guide/topics/media-apps/mediabuttons.html Пожалуйста, взгляните на это