Les utilisateurs s'attendent à pouvoir contrôler le volume d'une application audio. Le comportement standard inclut la possibilité d'utiliser les commandes de volume (boutons ou boutons rotatifs sur l'appareil ou curseurs dans l'interface utilisateur), et d'éviter la lecture soudaine à voix haute si un périphérique tel qu'un casque est déconnecté pendant son utilisation.
Utiliser les commandes de volume
Lorsqu'un utilisateur appuie sur une touche de volume dans une application de jeu ou de musique, le volume doit changer, même si le lecteur est mis en pause entre les titres ou qu'il n'y a pas de musique pour l'emplacement actuel du jeu.
Android utilise des flux audio distincts pour la lecture de musique, des alarmes, des notifications, de la sonnerie d'appel entrant, des sons système, du volume des appels et des tonalités DTMF. Les utilisateurs peuvent ainsi contrôler le volume de chaque flux indépendamment.
Par défaut, appuyer sur le bouton de réglage du volume modifie le volume du flux audio actif. Si votre application ne lit actuellement rien, appuyer sur les boutons de volume permet d'ajuster le volume de la musique (ou le volume de la sonnerie avant Android 9).
À moins que votre application ne soit un réveil, vous devez lire l'audio avec l'utilisation AudioAttributes.USAGE_MEDIA
.
Pour vous assurer que les commandes de volume ajustent le bon flux, vous devez appeler setVolumeControlStream()
en transmettant le type de flux correspondant à vos attributs que vous pouvez récupérer à partir de AudioAttributes.getVolumeControlStream
.
Kotlin
setVolumeControlStream(AudioManager.STREAM_MUSIC)
Java
setVolumeControlStream(AudioManager.STREAM_MUSIC);
Effectuez cet appel dans le cycle de vie de votre application, généralement à partir de la méthode onResume()
de l'activité ou du fragment qui contrôle vos contenus multimédias. Cela connecte les commandes de volume à STREAM_MUSIC
chaque fois que l'activité ou le fragment cible est visible.
Contrôler le volume de la diffusion de manière programmatique
Dans de rares cas, vous pouvez définir le volume d'un flux audio de manière programmatique. Par exemple, lorsque votre application remplace une UI existante. Nous vous déconseillons de le faire, car AudioManager
Android mélange tous les flux audio du même type.
Ces méthodes modifient le volume de chaque application qui utilise le flux. Évitez de les utiliser:
adjustStreamVolume()
adjustSuggestedStreamVolume()
adjustVolume()
setStreamVolume() setStreamVolume()
setStreamSolo()
setStreamMute()
Utiliser des appareils à volume fixe
Certains appareils (comme les Chromebook et les voitures Android Automotive OS) disposent de commandes de volume, mais n'autorisent pas les applications à utiliser les méthodes AudioManager
décrites précédemment pour modifier le niveau d'un flux audio. Il s'agit d'appareils à volume fixe. Pour savoir si votre application s'exécute sur un appareil à volume fixe, appelez isVolumeFixed()
.
Une application audio doit permettre d'équilibrer le volume de sortie avec d'autres applications qui peuvent être en cours de lecture sur le même flux.
Sur les appareils au volume fixe, l'application doit connecter ses propres commandes de volume à la méthode setVolume()
appropriée:
Joueur | Méthode |
---|---|
AudioTrack | AudioTrack.setVolume() |
MediaPlayer | MediaPlayer.setVolume() |
ExoPlayer | Utilisez SimpleExoPlayer.setVolume() , qui définit le volume de l'AudioTrack sous-jacent. |
Web | Définissez la propriété volume de HTMLMediaElement . |
Ne faites pas de bruit
Les utilisateurs disposent de plusieurs options pour profiter de l'audio de leurs appareils Android. La plupart des appareils disposent d'un haut-parleur intégré et de prises casque pour les casques filaires. De nombreux appareils sont également compatibles avec la connectivité Bluetooth et le format audio A2DP.
Lorsqu'un casque est débranché ou qu'un appareil Bluetooth est déconnecté, le flux audio est automatiquement redirigé vers le haut-parleur intégré. Si vous écoutez de la musique à un volume élevé, cela peut être une surprise bruyante.
Dans ce cas, les utilisateurs s'attendent généralement à ce que les applications qui incluent un lecteur de musique avec des commandes de lecture à l'écran mettent la lecture en pause. Les autres applications, comme les jeux qui n'incluent pas de commandes, devraient continuer à fonctionner. L'utilisateur peut régler le volume à l'aide des commandes matérielles de l'appareil.
Lorsque la sortie audio revient au haut-parleur intégré, le système diffuse un intent ACTION_AUDIO_BECOMING_NOISY
. Vous devez créer un BroadcastReceiver
qui écoute cet intent chaque fois que vous lisez du contenu audio. Votre récepteur doit se présenter comme suit:
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 } } }
Enregistrez le broadcast receiver lorsque vous commencez la lecture et annulez son enregistrement lorsque vous l'arrêtez.
Si vous concevez votre application comme décrit dans ce guide, ces appels doivent apparaître dans les rappels de session multimédia onPlay()
et 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); } }