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