Gestire le modifiche nell'output audio

Gli utenti si aspettano di poter controllare il volume di un'app audio. Il comportamento standard include la possibilità di utilizzare i controlli del volume (pulsanti o manopole del dispositivo oppure i cursori nell'interfaccia utente) ed evitare che vengano riprodotti all'improvviso ad alto volume se una periferica, ad esempio le cuffie, viene scollegata durante l'uso.

Utilizzare i controlli del volume

Quando un utente preme un tasto del volume in un gioco o in un'app di musica, il volume dovrebbe cambiare, anche se il player viene messo in pausa tra un brano e l'altro o se non c'è musica per la posizione corrente del gioco.

Android utilizza stream audio separati per la riproduzione di musica, sveglie, notifiche, suoneria delle chiamate in arrivo, suoni di sistema, volume delle chiamate e segnali DTMF. In questo modo gli utenti possono controllare il volume di ogni stream in modo indipendente.

Per impostazione predefinita, premendo il controllo del volume viene modificato il volume dello stream audio attivo. Se al momento l'app non riproduce nulla, puoi premere i tasti del volume per regolare il volume della musica (o il volume della suoneria prima di Android 9).

A meno che la tua app non sia una sveglia, dovresti riprodurre l'audio con l'utilizzo AudioAttributes.USAGE_MEDIA.

Per assicurarti che i controlli del volume modifichino lo stream corretto, devi chiamare il passaggio setVolumeControlStream() nel tipo di stream corrispondente agli attributi che puoi recuperare da AudioAttributes.getVolumeControlStream.

Kotlin

setVolumeControlStream(AudioManager.STREAM_MUSIC)

Java

setVolumeControlStream(AudioManager.STREAM_MUSIC);

Effettua questa chiamata nel ciclo di vita dell'app, in genere utilizzando il metodo onResume() dell'attività o del frammento che controlla i tuoi contenuti multimediali. In questo modo i controlli del volume vengono connessi a STREAM_MUSIC ogni volta che l'attività o il frammento di destinazione sono visibili.

Controllo del volume dello stream in modo programmatico

In rari casi, puoi impostare il volume di uno stream audio in modo programmatico. ad esempio quando la tua app sostituisce una UI esistente. Questa opzione non è consigliata perché l'AudioManager di Android unisce tutti gli stream audio dello stesso tipo. Questi metodi consentono di modificare il volume di ogni app che utilizza lo stream. Evita di usarli:

Utilizzare dispositivi a volume fisso

Alcuni dispositivi (come i Chromebook) sono dotati di controlli del volume, ma non consentono alle app di utilizzare i metodi AudioManager descritti in precedenza per modificare il livello di uno stream audio. Questi dispositivi sono chiamati dispositivi a volume fisso. Puoi scoprire se la tua app è in esecuzione su un dispositivo a volume fisso chiamando isVolumeFixed().

Un'app audio dovrebbe fornire la possibilità di bilanciare il volume di output con altre app che potrebbero essere in riproduzione nello stesso stream. Sui dispositivi a volume fisso, l'app deve connettere i propri controlli del volume al metodo setVolume() appropriato nella tabella seguente:

Giocatore Metodo
Traccia audio AudioTrack.setVolume()
Media player MediaPlayer.setVolume()
ExoPlayer Usa SimpleExoPlayer.setVolume() per impostare il volume della traccia audio sottostante.

Non essere rumoroso

Gli utenti hanno a disposizione una serie di alternative per ascoltare l'audio dai propri dispositivi Android. La maggior parte dei dispositivi è dotata di altoparlante integrato, jack per cuffie per cuffie con cavo e molti offrono anche connettività Bluetooth e supporto per l'audio A2DP.

Quando le cuffie vengono scollegate o un dispositivo Bluetooth disconnesso, lo stream audio viene reindirizzato automaticamente all'altoparlante integrato. Se ascolti musica ad alto volume, potresti avere una sorpresa rumorosa.

In genere, gli utenti si aspettano che le app che includono un lettore musicale con controlli di riproduzione sullo schermo mettano in pausa la riproduzione. Le altre app, come i giochi che non includono controlli, dovrebbero continuare a giocare. L'utente può regolare il volume con i controlli hardware del dispositivo.

Quando l'uscita audio torna sull'altoparlante integrato, il sistema trasmette un intent ACTION_AUDIO_BECOMING_NOISY. Dovresti creare un BroadcastReceiver che ascolti questo intent ogni volta che riproduci l'audio. Il destinatario dovrebbe avere il seguente aspetto:

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 il ricevitore quando inizi la riproduzione e annulla la registrazione quando ti interrompi. Se progetti la tua app come descritto in questa guida, queste chiamate dovrebbero apparire nei callback delle sessioni multimediali onPlay() e 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);
  }
}