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:
adjustStreamVolume()
adjustSuggestedStreamVolume()
adjustVolume()
setStreamVolume() setStreamVolume()
setStreamSolo()
setStreamMute()
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); } }