Użytkownicy oczekują możliwości sterowania głośnością aplikacji audio. Standardowe działanie obejmuje możliwość korzystania z elementów sterujących głośnością (przycisków lub pokręteł na urządzeniu lub suwaków w interfejsie) oraz unikanie nagłego odtwarzania dźwięku, jeśli podczas korzystania z aplikacji zostanie odłączone urządzenie peryferyjne, np. słuchawki.
Korzystanie z elementów sterujących głośnością
Gdy użytkownik naciśnie przycisk głośności w grze lub aplikacji muzycznej, głośność powinna się zmienić, nawet jeśli odtwarzacz jest wstrzymany między utworami lub nie ma muzyki dla bieżącej lokalizacji w grze.
Android używa osobnych strumieni audio do odtwarzania muzyki, alarmów, powiadomień, dzwonków połączeń przychodzących, dźwięków systemowych, głośności podczas połączeń i dźwięków DTMF. Dzięki temu użytkownicy mogą niezależnie kontrolować głośność poszczególnych strumieni.
Domyślnie naciśnięcie przycisku głośności zmienia głośność aktywnego strumienia audio. Jeśli aplikacja nie odtwarza obecnie żadnego dźwięku, naciśnięcie przycisków głośności powoduje zmianę głośności muzyki (lub głośności dzwonka w przypadku Androida 9).
O ile aplikacja nie jest budzikiem, powinna odtwarzać dźwięk z użyciem AudioAttributes.USAGE_MEDIA
.
Aby mieć pewność, że głośność jest dostosowywana do prawidłowego strumienia, wywołaj funkcję setVolumeControlStream()
, podając typ strumienia zgodny z atrybutami, które możesz pobrać z AudioAttributes.getVolumeControlStream
.
Kotlin
setVolumeControlStream(AudioManager.STREAM_MUSIC)
Java
setVolumeControlStream(AudioManager.STREAM_MUSIC);
Wykonuj to wywołanie w cyklu życia aplikacji, zwykle z metody onResume()
aktywności lub fragmentu, który kontroluje Twoje media. Spowoduje to połączenie elementów sterujących głośnością z elementem STREAM_MUSIC
, gdy tylko dany fragment lub aktywność są widoczne.
Sterowanie głośnością strumienia za pomocą kodu
W rzadkich przypadkach głośność strumienia audio można ustawić programowo. Na przykład gdy aplikacja zastępuje istniejący interfejs. Nie zalecamy tego, ponieważ AudioManager
na Androidzie łączy wszystkie strumienie audio tego samego typu.
Te metody zmieniają głośność każdej aplikacji, która korzysta z strumienia. Unikaj korzystania z nich:
adjustStreamVolume()
adjustSuggestedStreamVolume()
adjustVolume()
setStreamVolume() setStreamVolume()
setStreamSolo()
setStreamMute()
Praca z urządzeniami o stałym poziomie głośności
Niektóre urządzenia (np. Chromebooki i samochody z systemem Android Automotive) mają elementy sterujące głośnością, ale nie pozwalają aplikacjom używać opisanych wcześniej metod AudioManager
do zmiany poziomu strumienia audio. Są to urządzenia o stałym poziomie głośności. Aby sprawdzić, czy aplikacja działa na urządzeniu z ustawionymi głośnością, zadzwoń pod numer isVolumeFixed()
.
Aplikacja do odtwarzania dźwięku powinna umożliwiać wyrównywanie głośności wyjściowej z poziomem głośności innych aplikacji, które mogą odtwarzać dźwięk na tym samym kanale.
W przypadku urządzeń z stałym poziomem głośności aplikacja powinna połączyć własne elementy sterujące głośnością z odpowiednią metodą setVolume()
:
Zawodnik | Metoda |
---|---|
AudioTrack | AudioTrack.setVolume() |
MediaPlayer | MediaPlayer.setVolume() |
ExoPlayer | Użyj SimpleExoPlayer.setVolume() , który ustawia głośność podstawowego AudioTrack. |
Sieć | Ustaw właściwość volume elementu HTMLMediaElement . |
Nie hałasuj
Użytkownicy mają do wyboru kilka alternatyw, jeśli chodzi o słuchanie dźwięku na urządzeniach z Androidem. Większość urządzeń ma wbudowany głośnik i gniazdo słuchawek do podłączania przewodowych zestawów słuchawkowych. Wiele z nich ma też łączność Bluetooth i obsługuje dźwięk A2DP.
Gdy odłączysz zestaw słuchawkowy lub urządzenie Bluetooth, strumień audio automatycznie przełączy się na wbudowany głośnik. Jeśli słuchasz muzyki z dużą głośnością, może to być hałaśliwa niespodzianka.
Użytkownicy zwykle oczekują, że aplikacje zawierające odtwarzacz muzyczny z elementami sterującymi na ekranie będą w takich przypadkach wstrzymywać odtwarzanie. Inne aplikacje, takie jak gry bez elementów sterujących, powinny działać normalnie. Użytkownik może regulować głośność za pomocą elementów sterujących na urządzeniu.
Gdy wyjście audio przełączy się z powrotem na wbudowany głośnik, system wyśle intencję ACTION_AUDIO_BECOMING_NOISY
. Należy utworzyć BroadcastReceiver
, który wykrywa ten zamiar, gdy tylko odtwarzasz dźwięk. Odbiornik powinien wyglądać tak:
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 } } }
Zarejestruj odbiornik, gdy rozpoczynasz odtwarzanie, i usuń jego rejestrację, gdy je kończysz.
Jeśli zaprojektujesz aplikację zgodnie z tym przewodnikiem, te wywołania powinny pojawiać się w zwrotach wywołania onPlay()
i onStop()
sesji multimediów.
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); } }