Eventos de volumen de Android MediaRouter

Quiero implementar el cambio de volumen como se ve en la aplicación de Youtube durante el casting, como si la aplicación está en el fondo o en la pantalla de bloqueo

Me gusta esto

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

Ahora consigo el deslizador apenas como imagen arriba y responde a los botones del volumen, pero no recibo el cambio en mi receptor de la difusión.

Todo lo que tienes que hacer es crear un MediaSessionCompat con un 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); } } 

A continuación, conecte el VolumeProviderCompat a su 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)); 
  • ¿Cambiar el volumen de medios en Android?
  • Android: varias pistas de audio en un VideoView?
  • Decodificación de extracto de Android para codificar audio Mux
  • Ajuste del sonido para la notificación
  • AudioRecord y AudioTrack latency
  • Android: Necesidad de registrar la entrada de micrófono
  • Quiero comprobar el volumen de la voz en android
  • No se puede escuchar audio con el emulador de Android
  • Superpowered SDK: Implementación de SuperpoweredRecorder.h y configuración de rutas de grabación
  • Guardar la entrada de audio del motor de reconocimiento de voz de Android Stock
  • Combine Mp4s usando mp4parser en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.