Gestire le modifiche nell'output audio

Gli utenti si aspettano di poter controllare il volume di un'app audio. Comportamento standard include la possibilità di utilizzare i controlli del volume (i pulsanti o le manopole della dispositivo o cursori nell'interfaccia utente) e per evitare di emettere improvvisamente un volume alto se ad esempio le cuffie è disconnessa durante l'uso.

Uso dei controlli del volume

Quando un utente preme un tasto del volume in un'app di gioco o di musica, il volume dovrebbe anche se il player viene messo in pausa tra un brano e l'altro o non c'è musica per posizione attuale 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 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 dell'audio attivo. flusso di dati. Se al momento l'app non sta riproducendo alcun contenuto, premi i tasti del volume regola 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 audio con l'utilizzo AudioAttributes.USAGE_MEDIA.

Per assicurarti che i controlli del volume si regoli lo stream corretto, devi richiamare setVolumeControlStream() che passa il tipo di flusso corrispondente agli attributi che puoi recuperare AudioAttributes.getVolumeControlStream.

Kotlin

setVolumeControlStream(AudioManager.STREAM_MUSIC)

Java

setVolumeControlStream(AudioManager.STREAM_MUSIC);

Effettua questa chiamata durante il ciclo di vita della tua app, in genere dal onResume() il metodo dell'attività o del frammento che controlla i tuoi contenuti multimediali. Questo collega i controlli del volume impostandoli su STREAM_MUSIC ogni volta che l'attività o il frammento target è visibile.

Controllo del volume dei flussi in modo programmatico

In rari casi, puoi impostare il volume di uno stream audio in modo programmatico. Per ad esempio quando l'app sostituisce una UI esistente. Questa azione è sconsigliata 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 utilizzare quali:

Utilizzare dispositivi a volume fisso

Alcuni dispositivi (come i Chromebook) sono dotati di controlli del volume ma non consentono alle app di usare AudioManager descritti sopra per modificare il livello di uno stream audio. Questi vengono chiamati dispositivi a volume fisso. Puoi scoprire se le tue l'app è in esecuzione su un dispositivo a volume fisso chiamando il numero isVolumeFixed().

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

Giocatore Metodo
Traccia audio AudioTrack.setVolume()
Media player MediaPlayer.setVolume()
ExoPlayer Usa SimpleExoPlayer.setVolume(), che imposta il volume dell'AudioTrack sottostante.

Non fare rumore

Gli utenti hanno a disposizione diverse alternative per godersi l'audio dal sui dispositivi Android. La maggior parte dei dispositivi è dotata di altoparlante integrato, jack per cuffie per le cuffie con cavo e molte dispongono inoltre di connettività Bluetooth e supporto per Audio A2DP.

Quando le cuffie sono scollegate o un dispositivo Bluetooth disconnesso, lo stream audio reindirizza automaticamente l'utente all'altoparlante integrato. Se ascolti musica a un volume elevato volume, potrebbe essere una rumorosa sorpresa.

Gli utenti di solito si aspettano app che includono un lettore musicale con riproduzione sullo schermo per mettere in pausa la riproduzione. Altre app, ad esempio giochi che non supportano controlli, dovresti continuare a giocare. L'utente può regolare il volume con controlli hardware del dispositivo.

Quando l'uscita audio torna all'altoparlante integrato, il sistema trasmette un ACTION_AUDIO_BECOMING_NOISY l'intento. Devi creare un BroadcastReceiver che ascolta questa intenzione ogni volta che riproduci l'audio. Il destinatario dovrebbe avere l'aspetto seguente:

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 all'inizio della riproduzione e annulla la registrazione quando la interrompi. Se progetti la tua app come descritto in questa guida, queste chiamate dovrebbero essere visualizzate 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);
  }
}