Gérer les modifications de la sortie audio

Les utilisateurs s'attendent à pouvoir contrôler le volume d'une application audio. Comportement standard inclut la possibilité d'utiliser les commandes de volume (que ce soit sur les boutons ou les curseurs de l'interface utilisateur), et éviter d'en diffuser soudainement périphérique comme un casque est déconnecté en cours d'utilisation.

Utilisation des commandes de volume

Lorsqu'un utilisateur appuie sur une touche de volume dans un jeu ou une application musicale, le volume doit même si le lecteur est en pause entre les titres ou qu'il n'y a pas de musique pour le la position actuelle du jeu.

Android utilise des flux audio distincts pour la musique, les alarmes notifications, la sonnerie des appels entrants, les sons du système, le volume des appels et les notifications DTMF tons clairs. Les utilisateurs peuvent ainsi contrôler le volume de chaque diffusion de manière indépendante.

Par défaut, le fait d'appuyer sur la commande de volume modifie le volume de l'audio actif. flux. Si votre application ne lit rien en ce moment, appuyez sur les boutons de volume. règle le volume de la musique (ou du volume de la sonnerie avant Android 9).

À moins que votre appli ne soit un réveil, vous devez lire du contenu audio AudioAttributes.USAGE_MEDIA

Pour vous assurer que les commandes de volume s'ajustent le flux approprié, vous devez appeler setVolumeControlStream() en transmettant le type de flux correspondant à vos attributs que vous pouvez récupérer 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 onResume() de l'activité ou du fragment qui contrôle votre contenu multimédia. Cela permet de relier les commandes de volume sur STREAM_MUSIC chaque fois que l'activité ou le fragment cible est visible.

Contrôler le volume de flux de manière automatisée

Dans de rares cas, vous pouvez régler le volume d'un flux audio de manière programmatique. Pour lorsque votre application remplace une interface utilisateur existante. Cela n'est pas recommandé, car le AudioManager d'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 d'utiliser :

Utiliser des appareils à volume fixe

Certains appareils (comme les Chromebooks) disposent de commandes de volume, mais n'autorisent pas les applications à utiliser AudioManager décrites ci-dessus pour modifier le niveau d'un flux audio. On les appelle volume fixe. Vous pouvez découvrir si votre L'application s'exécute sur un appareil à volume fixe en appelant isVolumeFixed().

Une application audio doit permettre d'équilibrer son volume de sortie avec d'autres applications qui pourraient être lues sur le même flux. Sur les appareils à volume fixe, l'application doit connecter ses propres commandes de volume au méthode setVolume() appropriée dans le tableau ci-dessous:

Joueur Méthode
Piste audio AudioTrack.setVolume()
MediaPlayer MediaPlayer.setVolume()
ExoPlayer Utilisez SimpleExoPlayer.setVolume() pour définir le volume de la piste audio sous-jacente.

Ne soyez pas bruyant

Les utilisateurs disposent de plusieurs options pour profiter de l'audio de leurs appareils Android. La plupart des appareils sont équipés d'un haut-parleur intégré, de connecteurs casque pour casques filaires et nombre d’entre eux proposent également une connectivité Bluetooth et prennent en charge Audio A2DP

Lorsqu'un casque est débranché ou qu'un appareil Bluetooth est déconnecté, le flux audio redirige automatiquement vers le haut-parleur intégré. Si vous écoutez de la musique à une température élevée ce volume peut être bruyant.

Les utilisateurs s'attendent généralement à des applications qui incluent un lecteur de musique avec lecture à l'écran. pour mettre la lecture en pause. D'autres applications, comme les jeux incluent des commandes, doivent continuer à jouer. L'utilisateur peut régler le volume à l'aide de la commandes matérielles de l'appareil.

Lorsque la sortie audio revient sur le haut-parleur intégré, le système diffuse une ACTION_AUDIO_BECOMING_NOISY l'intention. Vous devez créer un BroadcastReceiver qui écoute cet intent chaque fois que vous lisez du contenu audio. Votre récepteur devrait 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 récepteur lorsque vous commencez la lecture et annulez-le à l'arrêt. Si vous concevez votre application comme indiqué 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);
  }
}