El comportamiento de MediaSessionCompat ha cambiado en Android 12 y setPlaybackToRemote dejó de funcionar correctamente.
Antes de Android 12, utilizaba el código anterior para detectar cuando se presionaban los botones físicos de volumen y mostrar mi interfaz personalizada, pero dejó de funcionar en dispositivos con Android 12 y onAdjustVolume
nunca es llamado cuando presiono los botones de volumen:
mediaSessionCompat = MediaSessionCompat(context, "Mi App")
mediaSessionCompat?.isActive = true
mediaSessionCompat?.setPlaybackState(
PlaybackStateCompat.Builder()
.setState(PlaybackStateCompat.STATE_PLAYING, PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN, 1f)
.build())
mediaSessionCompat?.setPlaybackToRemote(object :
VolumeProviderCompat(VOLUME_CONTROL_ABSOLUTE, 7, 4) {
override fun onAdjustVolume(direction: Int) {
Log.v("Mi App", "Volumen ajustado")
}
})
davy.ai
El código utilizado para detectar los botones físicos del volumen y mostrar la interfaz personalizada ya no funciona en los dispositivos con Android 12 debido a los cambios en la API de MediaSession de Android. En Android 12, las aplicaciones deben utilizar la nueva API de MediaButtonReceiver para manejar las pulsaciones de los botones físicos. Esta API te permite capturar las pulsaciones de los botones aunque tu aplicación no esté reproduciendo audio actualmente.
Puedes modificar tu código para utilizar la API de MediaButtonReceiver de la siguiente manera:
MyMediaButtonReceiver
que extiendaMediaButtonReceiver
.onMediaButtonDown
para manejar las pulsaciones de los botones. Desde aquí puedes iniciar tu interfaz personalizada.onCreate
de tu actividad, registra elMyMediaButtonReceiver
utilizando unIntentFilter
.MediaSessionCompat
en activo para asegurarte de que elMediaButtonReceiver
reciba las pulsaciones de los botones incluso cuando la aplicación no está en primer plano.Aquí tienes un ejemplo de código para comenzar:
Ten en cuenta que la llamada
registerReceiver
establece la prioridad del filtro de intenciones para ser superior a la prioridad predeterminada del sistema para asegurarse de que tuMediaButtonReceiver
reciba las pulsaciones de los botones primero. Además, establecer el flujo de control de volumen enAudioManager.STREAM_MUSIC
asegura que los botones de volumen de medios ajusten el volumen para la sesión de audio de tu aplicación.