Android MediaRouter Объем событий
Я хочу реализовать изменение громкости, как видно в приложении Youtube во время приведения, например, если приложение находится в фоновом режиме или на экране блокировки
private void createSession() {
ComponentName receiver = new ComponentName(getPackageName(), RemoteReceiver.class.getName());
mediaSession = new MediaSessionCompat(this, "PlayerService", receiver, null);
mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
mediaSession.setPlaybackState(new PlaybackStateCompat.Builder()
.setState(PlaybackStateCompat.STATE_PLAYING, 0, 1f)
.setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE)
.build());
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.requestAudioFocus(new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
// Ignore
}
}, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
mediaSession.setActive(true);
mediaRouter = MediaRouter.getInstance(this);
mediaRouter.setMediaSessionCompat(mediaSession);
}
Теперь я получаю ползунок, как на изображении выше, и он реагирует на кнопки громкости, но я не получаю изменения в моем приемнике вещания.
1 ответ
Решение
Все, что вам нужно сделать, это создать MediaSessionCompat
с VolumeProviderCompat
,
// Here is a volume provider which sets the volume of a remote route.
// Extend VolumeProviderCompat with your own implementation.
public static class RemoteVolume extends VolumeProviderCompat {
public RemoteVolume(MediaRouter.RouteInfo routeInfo) {
super(VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE, STEPS, 0);
this.stepSize = routeInfo.getVolumeMax() / STEPS;
this.routeInfo = routeInfo;
}
@Override
public void onSetVolumeTo(int volume) {
routeInfo.requestSetVolume(volume * stepSize);
setCurrentVolume(volume);
}
@Override
public void onAdjustVolume(int delta) {
int newVolume = getCurrentVolume() + delta;
routeInfo.requestSetVolume(newVolume * stepSize);
setCurrentVolume(newVolume);
}
}
Затем подключите VolumeProviderCompat
на ваш MediaSessionCompat
:
MediaSessionCompat session = new MediaSessionCompat(context, TAG);
// might need some of these flags
session.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS |
MediaSessionCompat.FLAG_HANDLES_QUEUE_COMMANDS);
// the volume buttons are routed to this session when it is
// active and currently playing
session.setPlaybackState(new PlaybackStateCompat.Builder()
.setState(PlaybackStateCompat.STATE_PLAYING, 0, 1.0f)
.build());
session.setActive(true);
// The media router tries to bind its own VolumeProvider which kinda
// works. We need to unbind the one provided and put ours in.
router.setMediaSessionCompat(session);
session.setPlaybackToRemote(new RemoteVolume(myRemoteRoute));