Gestire le modifiche nell'output audio

Gli utenti si aspettano di poter regolare il volume di un'app audio. Il comportamento standard include la possibilità di utilizzare i controlli del volume (pulsanti o manopole sul dispositivo o cursori nell'interfaccia utente) ed evitare che la riproduzione venga riprodotta a volume alto se una periferica come le cuffie viene scollegata durante l'uso.

Utilizzare i controlli del volume

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

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

Per impostazione predefinita, la pressione del controllo del volume modifica il volume dello stream audio attivo. Se al momento l'app non sta riproducendo nulla, premendo i tasti del volume viene regolato il volume della musica (o il volume della suoneria prima di Android 9).

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

Per assicurarti che i controlli del volume regolino lo stream corretto, devi chiamare setVolumeControlStream() passando il tipo di stream corrispondente ai tuoi attributi che puoi recuperare da AudioAttributes.getVolumeControlStream.

Kotlin

setVolumeControlStream(AudioManager.STREAM_MUSIC)

Java

setVolumeControlStream(AudioManager.STREAM_MUSIC);

Esegui questa chiamata nel ciclo di vita dell'app, in genere dal metodo onResume() dell'attività o del frammento che controlla i contenuti multimediali. In questo modo, i controlli del volume vengono collegati a STREAM_MUSIC ogni volta che l'attività o il frammento di destinazione è visibile.

Regolare il volume dello stream in modo programmatico

In rari casi, puoi impostare il volume di uno stream audio tramite programmazione. Ad esempio, quando la tua app sostituisce un'interfaccia utente esistente. Questa operazione non è consigliata perché Android AudioManager mescola tutti gli stream audio dello stesso tipo. Questi metodi modificano il volume di ogni app che utilizza lo stream. Evita di utilizzarli:

Utilizzo di dispositivi con volume fisso

Alcuni dispositivi (come Chromebook e auto con sistema operativo Android Automotive) dispongono 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. Si tratta di dispositivi con volume fisso. Puoi scoprire se la tua app è in esecuzione su un dispositivo con volume fisso chiamando isVolumeFixed().

Un'app audio deve offrire la possibilità di bilanciare il volume in uscita con quello di altre app che potrebbero essere in riproduzione nello stesso stream. Sui dispositivi con volume fisso, l'app deve collegare i propri controlli del volume al metodo setVolume() appropriato:

Giocatore Metodo
AudioTrack AudioTrack.setVolume()
MediaPlayer MediaPlayer.setVolume()
ExoPlayer Utilizza SimpleExoPlayer.setVolume() per impostare il volume dell'AudioTrack sottostante.
Web Imposta la proprietà volume di HTMLMediaElement

Non fare rumore

Gli utenti hanno a disposizione diverse alternative per ascoltare l'audio dai loro dispositivi Android. La maggior parte dei dispositivi è dotata di uno speaker integrato, jack per cuffie per cuffie con cavo e molti dispongono anche di connettività Bluetooth e supportano l'audio A2DP.

Quando le cuffie vengono scollegate o un dispositivo Bluetooth viene disconnesso, lo stream audio viene reindirizzato automaticamente allo speaker integrato. Se ascolti musica ad alto volume, questa può essere una sorpresa rumorosa.

In questo caso, gli utenti si aspettano che le app che includono un player musicale con controlli di riproduzione sullo schermo mettano in pausa la riproduzione. Altre app, come i giochi che non includono controlli, dovrebbero continuare a essere riprodotte. L'utente può regolare il volume con i controlli hardware del dispositivo.

Quando l'output audio torna allo speaker integrato, il sistema trasmette un ACTION_AUDIO_BECOMING_NOISY intento. Devi creare un BroadcastReceiver che ascolti questo intento ogni volta che riproduci l'audio. Il ricevitore 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 la interrompi. Se progetti la tua app come descritto in questa guida, queste chiamate dovrebbero apparire nei callback della sessione multimediale 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);
  }
}