Obsługa zmian w wyjściu audio

Użytkownicy oczekują możliwości kontrolowania głośności w aplikacji audio. Standardowe działanie obejmuje możliwość korzystania z elementów sterujących głośnością (przycisków lub pokrętła na urządzeniu albo suwaków w interfejsie) oraz unikanie nagłego odtwarzania dźwięku, jeśli urządzenie peryferyjne, takie jak słuchawki, jest odłączone podczas używania.

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 gry.

Android używa osobnych strumieni audio do odtwarzania muzyki, alarmów, powiadomień, dzwonka połączenia przychodzącego, dźwięków systemowych, głośności połączenia i tonów DTMF. Dzięki temu użytkownicy mogą niezależnie kontrolować głośność każdego strumienia.

Naciśnięcie przycisku głośności domyślnie zmienia głośność aktywnego strumienia audio. Jeśli aplikacja nic nie odtwarza, naciśnięcie przycisków głośności dostosuje głośność muzyki (lub głośność dzwonka przed Androidem 9).

Jeśli Twoja aplikacja nie jest budzikiem, zalecamy odtwarzanie dźwięku za pomocą AudioAttributes.USAGE_MEDIA.

Aby mieć pewność, że regulacja głośności dopasuje właściwy strumień, wywołaj setVolumeControlStream() passing w typie strumienia zgodnym z atrybutami, które można pobierać w usłudze AudioAttributes.getVolumeControlStream.

Kotlin

setVolumeControlStream(AudioManager.STREAM_MUSIC)

Java

setVolumeControlStream(AudioManager.STREAM_MUSIC);

Utwórz je w cyklu życia aplikacji, zwykle z metody onResume() aktywności lub fragmentu, który steruje multimediami. Łączy to sterowanie głośnością z elementem STREAM_MUSIC, gdy widoczna jest docelowa aktywność lub fragment.

Automatyczne sterowanie głośnością strumienia

W rzadkich przypadkach możesz ustawić głośność strumienia audio automatycznie. np. gdy aplikacja zastępuje obecny interfejs. Nie jest to zalecane, ponieważ AudioManager na Androidzie łączy ze sobą wszystkie strumienie audio tego samego typu. Te metody powodują zmianę głośności 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 używanie opisanych powyżej metod AudioManager do zmiany poziomu strumienia audio. Są to tzw. urządzenia o stałej głośności. Aby sprawdzić, czy aplikacja działa na urządzeniu o stałej głośności, zadzwoń pod numer isVolumeFixed().

Aplikacja audio powinna umożliwiać zrównoważenie głośności wyjściowej z innymi aplikacjami odtwarzanymi w ramach tego samego strumienia. Na urządzeniach ze stałą głośnością aplikacja powinna połączyć własne regulacje głośności z odpowiednią metodą setVolume() podaną w tabeli poniżej:

Zawodnik Metoda
Ścieżka audio AudioTrack.setVolume()
Odtwarzacz multimedialny MediaPlayer.setVolume()
ExoPlayer Użyj SimpleExoPlayer.setVolume(), który ustawia głośność bazowej ścieżki audio.

Nie głośno

Użytkownicy urządzeń z Androidem mają do dyspozycji wiele różnych możliwości słuchania dźwięku na urządzeniach z Androidem. Większość urządzeń ma wbudowany głośnik i gniazda słuchawek, a wiele z nich ma też łączność Bluetooth i obsługę dźwięku A2DP.

Gdy zestaw słuchawkowy jest odłączony lub urządzenie Bluetooth jest odłączone, strumień audio automatycznie przekierowuje do wbudowanego głośnika. Jeśli słuchasz muzyki głośno, może to być głośna niespodzianka.

Użytkownicy zwykle oczekują, że aplikacje zawierające odtwarzacz muzyki z elementami sterującymi odtwarzaniem na ekranie wstrzymają odtwarzanie. Inne aplikacje, np. gry bez elementów sterujących, powinny działać bez przerw. Użytkownik może dostosować głośność za pomocą elementów sterujących urządzenia.

Gdy wyjście audio przełączy się z powrotem na wbudowany głośnik, system przekaże intencję ACTION_AUDIO_BECOMING_NOISY. Utwórz BroadcastReceiver, który będzie nasłuchiwać 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ę tak, jak opisujemy w tym przewodniku, wywołania te powinny pojawiać się w wywołaniach sesji multimedialnych 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);
  }
}