es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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")
        }
    })
Tags:  , , ,

Answer

  1. Avatar for 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:

    1. Crea una nueva clase MyMediaButtonReceiver que extienda MediaButtonReceiver.
    2. Sobrescribe el método onMediaButtonDown para manejar las pulsaciones de los botones. Desde aquí puedes iniciar tu interfaz personalizada.
    3. En el método onCreate de tu actividad, registra elMyMediaButtonReceiver utilizando un IntentFilter.
    4. Establece la MediaSessionCompat en activo para asegurarte de que el MediaButtonReceiver 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:

    class MyMediaButtonReceiver : MediaButtonReceiver() {
        override fun onMediaButtonDown(mediaButtonIntent: Intent?, context: Context?): Boolean {
            // Maneja la pulsación del botón de medios aquí
            // Inicia la interfaz personalizada
            return true
        }
    }
    
    class MyActivity : AppCompatActivity() {
        private lateinit var mediaSessionCompat: MediaSessionCompat
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            mediaSessionCompat = MediaSessionCompat(this, "Mi Aplicación")
            mediaSessionCompat.isActive = true
    
            val filter = IntentFilter(Intent.ACTION_MEDIA_BUTTON)
            filter.priority = IntentFilter.SYSTEM_HIGH_PRIORITY - 1
            registerReceiver(MyMediaButtonReceiver(), filter)
    
            // Establece el control de volumen en la sesión de medios
            volumeControlStream = AudioManager.STREAM_MUSIC
        }
    }
    

    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 tu MediaButtonReceiver reciba las pulsaciones de los botones primero. Además, establecer el flujo de control de volumen en AudioManager.STREAM_MUSIC asegura que los botones de volumen de medios ajusten el volumen para la sesión de audio de tu aplicación.

Comments are closed.