Obsługa zmian w wyjściu audio

Użytkownicy oczekują możliwości sterowania głośnością aplikacji audio. Standardowe zachowanie umożliwia sterowanie głośnością (przyciskami lub pokrętłami na urządzenia lub suwaków w interfejsie) oraz uniknąć nagłego odtwarzania na głos, jeśli urządzenie peryferyjne, takie jak słuchawki, jest odłączone podczas używania.

Sterowanie głośnością

Gdy użytkownik naciśnie przycisk głośności w grze lub aplikacji muzycznej, głośność powinna zmieniać nawet wtedy, gdy odtwarzanie muzyki zostało wstrzymane między utworami lub jeśli nie słyszysz muzyki miejsce gry.

Android używa osobnych strumieni audio do odtwarzania muzyki, alarmów powiadomienia, dzwonek połączenia przychodzącego, dźwięki systemowe, głośność podczas połączenia i DTMF; tony. Dzięki temu użytkownicy mogą niezależnie regulować głośność każdego strumienia.

Domyślnie naciśnięcie elementu sterującego głośnością zmienia głośność aktywnego dźwięku . Jeśli w aplikacji nic obecnie nie odtwarza, naciśnij przyciski głośności. reguluje głośność muzyki (lub głośność dzwonka przed Androidem 9).

Jeśli Twoja aplikacja nie jest budzikiem, należy odtwarzać dźwięk podczas użytkowania AudioAttributes.USAGE_MEDIA

Aby dostosować sterowanie głośnością do właściwego strumienia, wywołaj setVolumeControlStream() przekazywanie typu strumienia pasującego do atrybutów, z których można pobrać dane AudioAttributes.getVolumeControlStream

Kotlin

setVolumeControlStream(AudioManager.STREAM_MUSIC)

Java

setVolumeControlStream(AudioManager.STREAM_MUSIC);

Wykonaj to wywołanie w cyklu życia aplikacji, zwykle z onResume() działania lub fragmentu, który kontroluje odtwarzanie multimediów. Łączy to ustaw głośność na STREAM_MUSIC za każdym razem, gdy docelowa aktywność lub fragment jest widoczny.

Automatyczne sterowanie głośnością transmisji

W rzadkich przypadkach głośność strumienia audio można ustawić automatycznie. Dla: np. gdy aplikacja zastępuje istniejący interfejs. Nie jest to zalecane, ponieważ Android AudioManager łączy ze sobą wszystkie strumienie audio tego samego typu. Te metody zmieniają głośność każdej aplikacji, która korzysta ze strumienia. Unikaj stosowania :

Praca z urządzeniami o stałej głośności

Niektóre urządzenia (np. Chromebooki) mają regulację głośności, ale nie pozwalają aplikacjom na korzystanie z przycisku AudioManager opisanych powyżej metod zmiany poziomu strumienia audio. Są to tzw. urządzenia o stałej głośności. Możesz sprawdzić, czy aplikacja działa na urządzeniu o stałej głośności, wywołując metodę isVolumeFixed().

Aplikacja audio powinna umożliwiać jego głośność wyjściowa z innymi aplikacjami, które mogą być odtwarzane w ramach tego samego strumienia. Na urządzeniach ze stałą głośnością aplikacja powinna mieć własne elementy sterujące głośnością odpowiednią metodę setVolume() w tabeli poniżej:

Zawodnik Metoda
Ścieżka dźwiękowa AudioTrack.setVolume()
Odtwarzacz MediaPlayer MediaPlayer.setVolume()
ExoPlayer Użyj opcji SimpleExoPlayer.setVolume(), która ustawia głośność ścieżki audio.

Nie głośno

Użytkownicy mają wiele możliwości słuchania muzyki z urządzeń z Androidem. Większość urządzeń ma wbudowany głośnik i gniazda słuchawek przewodowe zestawy słuchawkowe. Wiele z nich ma też połączenie Bluetooth i obsługuje Dźwięk A2DP.

Po odłączeniu zestawu słuchawkowego lub odłączeniu urządzenia Bluetooth strumień audio przekierowuje automatycznie na wbudowany głośnik. Jeśli słuchasz muzyki na wysokim poziomie głośność, może to być głośna niespodzianka.

Użytkownicy zwykle oczekują aplikacji zawierających odtwarzacz muzyki z odtwarzaniem na ekranie aby w takim przypadku wstrzymać odtwarzanie. inne aplikacje, np. gry, które nie obsługują tej funkcji. zawierać elementy sterujące, należy kontynuować odtwarzanie. Użytkownik może dostosować głośność za pomocą do sterowania sprzętowego urządzenia.

Gdy wyjście audio przełączy się z powrotem na wbudowany głośnik, system wyśle sygnał ACTION_AUDIO_BECOMING_NOISY intencji. Należy utworzyć BroadcastReceiver który nasłuchuje tej intencji, gdy odtwarzasz dźwięk. Twój 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 po rozpoczęciu odtwarzania i wyrejestruj go po zatrzymaniu. Jeśli projektujesz aplikację w sposób opisany w tym przewodniku, wywołania te powinny być widoczne w wywołaniach zwrotnych sesji multimediów onPlay() i 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);
  }
}