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:
adjustStreamVolume()
adjustSuggestedStreamVolume()
adjustVolume()
setStreamVolume() setStreamVolume()
setStreamSolo()
setStreamMute()
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); } }