Obsługa zmian w wyjściu audio

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:

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()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);
  }
}