Cómo controlar cambios en la salida de audio

Los usuarios esperan poder controlar el volumen de una app de audio. Comportamiento estándar incluye la capacidad de usar los controles de volumen (ya sean botones o perillas en el dispositivo o controles deslizantes de la IU) y para evitar que se reproduzca un sonido en voz alta El periférico, como los auriculares, se desconecta mientras está en uso.

Cómo usar los controles de volumen

Cuando un usuario presiona una tecla de volumen en un juego o app de música, el volumen debe incluso si el reproductor está pausado entre canciones o si no hay música para la ubicación actual del juego.

Android usa transmisiones de audio independientes para reproducir música, alarmas, notificaciones, timbre de llamadas entrantes, sonidos del sistema, volumen de llamadas y DTMF de tonos. Esto permite a los usuarios controlar el volumen de cada transmisión de forma independiente.

De forma predeterminada, cuando se presiona el control de volumen, se modifica el volumen del audio activo. en tiempo real. Si la app no está reproduciendo nada, presiona las teclas de volumen ajusta el volumen de la música (o el volumen del timbre en versiones anteriores a Android 9).

A menos que la app sea una alarma, deberías reproducir audio con el uso AudioAttributes.USAGE_MEDIA

Para asegurarte de que los controles de volumen se ajusten la transmisión correcta, deberías llamar setVolumeControlStream() y pasar el tipo de transmisión que coincida con tus atributos que puedes recuperar AudioAttributes.getVolumeControlStream

Kotlin

setVolumeControlStream(AudioManager.STREAM_MUSIC)

Java

setVolumeControlStream(AudioManager.STREAM_MUSIC);

Realiza esta llamada en el ciclo de vida de tu app, generalmente desde el onResume(). método de la actividad o el fragmento que controla tu contenido multimedia. Esto conecta los controles de volumen en STREAM_MUSIC cada vez que la actividad o el fragmento objetivo esté visible.

Cómo controlar el volumen de transmisión de manera programática

En casos excepcionales, puedes establecer el volumen de una transmisión de audio de manera programática. Para por ejemplo, cuando tu app reemplaza una IU existente. Esto no se recomienda porque AudioManager de Android mezcla todas las transmisiones de audio del mismo tipo. Los siguientes métodos cambian el volumen de cada app que usa la transmisión Evita el uso con ellos:

Cómo trabajar con dispositivos que tienen el volumen fijo

Algunos dispositivos (como las Chromebooks) tienen controles de volumen, pero no permiten que las apps usen la AudioManager. descrito anteriormente para cambiar el nivel de una transmisión de audio. Estos se denominan de volumen fijo. Puedes descubrir si tu se ejecuta en un dispositivo de volumen fijo llamando a isVolumeFixed().

Una app de audio debe proporcionar la capacidad de equilibrar el volumen de salida con otras apps que podrían estar reproduciendo contenido en la misma transmisión. En dispositivos de volumen fijo, la app debe conectar sus propios controles de volumen al método setVolume() apropiado en la siguiente tabla:

Jugador Método
AudioTrack AudioTrack.setVolume()
MediaPlayer MediaPlayer.setVolume()
ExoPlayer Utiliza SimpleExoPlayer.setVolume(), que establece el volumen del método AudioTrack subyacente.

Evita el volumen demasiado alto

Los usuarios tienen una serie de alternativas para disfrutar del audio sus dispositivos Android. La mayoría de los dispositivos tienen una bocina integrada, conectores de auriculares para auriculares con cable, y muchos tienen conectividad Bluetooth y compatibilidad con Audio A2DP.

Cuando se desconectan los auriculares o un dispositivo Bluetooth, la transmisión de audio se redireccionará automáticamente a la bocina integrada. Si escuchas música a una altura puede ser una sorpresa muy ruidosa.

Por lo general, los usuarios esperan apps que incluyen un reproductor de música con reproducción en pantalla. para pausar la reproducción en este caso. Otras apps, como los juegos que no incluyen controles, deberían seguir jugando. El usuario puede ajustar el volumen con el controles de hardware del dispositivo.

Cuando la salida de audio cambia a la bocina integrada, el sistema transmite una ACTION_AUDIO_BECOMING_NOISY. . Debes crear un BroadcastReceiver. que escucha este intent cada vez que reproduces audio. El receptor debe verse de esta manera:

Kotlin

private class BecomingNoisyReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == AudioManager.ACTION_AUDIO_BECOMING_NOISY) {
            // Pause the playback
        }
    }
}

Java

private class BecomingNoisyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
      if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
          // Pause the playback
      }
    }
}

Registra el receptor cuando comience la reproducción y anula el registro cuando se detenga. Si diseñas tu app como se describe en esta guía, estas llamadas deberían aparecer en las devoluciones de llamada de la sesión multimedia onPlay() y onStop()

Kotlin

private val intentFilter = IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY)
private val myNoisyAudioStreamReceiver = BecomingNoisyReceiver()

private val callback = object : MediaSessionCompat.Callback() {

    override fun onPlay() {
        registerReceiver(myNoisyAudioStreamReceiver, intentFilter)
    }

    override fun onStop() {
        unregisterReceiver(myNoisyAudioStreamReceiver)
    }
}

Java

private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
private BecomingNoisyReceiver myNoisyAudioStreamReceiver = new BecomingNoisyReceiver();

MediaSessionCompat.Callback callback = new
MediaSessionCompat.Callback() {
  @Override
  public void onPlay() {
    registerReceiver(myNoisyAudioStreamReceiver, intentFilter);
  }

  @Override
  public void onStop() {
    unregisterReceiver(myNoisyAudioStreamReceiver);
  }
}