Steuerung der Audioausgabe ermöglichen

Nutzer erwarten, dass sie die Lautstärke einer Audio-App steuern können. Das Standardverhalten beinhaltet die Möglichkeit, die Lautstärketasten (Tasten oder Drehknöpfe auf dem Gerät oder Schieberegler in der Benutzeroberfläche) zu verwenden und zu vermeiden, dass es plötzlich laut wird, wenn ein Peripheriegerät wie Kopfhörer während der Nutzung getrennt wird.

Lautstärkeregler verwenden

Wenn ein Nutzer eine Lautstärketaste in einer Spiele- oder Musik-App drückt, sollte sich die Lautstärke ändern, auch wenn der Player zwischen den Titeln pausiert wird oder für den aktuellen Spielstandort keine Musik wiedergegeben wird.

Android verwendet separate Audiostreams zum Abspielen von Musik, Weckern, Benachrichtigungen, dem Klingelton für eingehende Anrufe, Systemtönen, Lautstärke während des Anrufs und DTMF-Tönen. So können Nutzer die Lautstärke der einzelnen Streams unabhängig voneinander einstellen.

Standardmäßig wird durch Drücken des Lautstärkereglers die Lautstärke des aktiven Audiostreams geändert. Wenn in Ihrer App gerade nichts abgespielt wird, können Sie mit den Lautstärketasten die Musiklautstärke anpassen (bzw. die Klingeltonlautstärke vor Android 9).

Sofern deine App kein Wecker ist, solltest du Audio mit der Nutzung AudioAttributes.USAGE_MEDIA abspielen.

Damit die Lautstärkeregler den richtigen Stream anpassen, sollten Sie setVolumeControlStream() aufrufen und dabei den Streamtyp übergeben, der Ihren Attributen entspricht, die Sie aus AudioAttributes.getVolumeControlStream abrufen können.

Kotlin

setVolumeControlStream(AudioManager.STREAM_MUSIC)

Java

setVolumeControlStream(AudioManager.STREAM_MUSIC);

Führen Sie diesen Aufruf im Lebenszyklus Ihrer App aus, in der Regel von der Methode onResume() der Aktivität oder des Fragments, das bzw. das Ihre Medien steuert. Dadurch werden die Lautstärkeregler immer mit STREAM_MUSIC verbunden, wenn die Zielaktivität oder das Zielfragment sichtbar ist.

Streamlautstärke programmatisch steuern

In seltenen Fällen können Sie die Lautstärke eines Audiostreams programmatisch festlegen. Beispielsweise wenn Ihre Anwendung eine vorhandene UI ersetzt. Dies wird nicht empfohlen, da der Android-AudioManager alle Audiostreams desselben Typs miteinander mischt. Mit diesen Methoden wird die Lautstärke aller Apps angepasst, die den Stream verwenden. Vermeiden Sie die Verwendung:

Geräte mit festem Volume verwenden

Einige Geräte (z. B. Chromebooks) haben Lautstärkeregler, lassen aber nicht zu, dass Apps die oben beschriebenen AudioManager-Methoden verwenden, um die Lautstärke eines Audiostreams zu ändern. Diese werden als Geräte mit festem Volume bezeichnet. Durch Aufrufen von isVolumeFixed() können Sie feststellen, ob Ihre App auf einem Gerät mit festem Volume ausgeführt wird.

Eine Audio-App sollte die Möglichkeit bieten, die Ausgabelautstärke mit anderen Apps auszugleichen, die möglicherweise im selben Stream wiedergegeben werden. Auf Geräten mit fester Lautstärke sollte die App ihre eigenen Lautstärkeregler mit der entsprechenden setVolume()-Methode aus der folgenden Tabelle verbinden:

Spieler Methode
Audiotrack AudioTrack.setVolume()
Mediaplayer MediaPlayer.setVolume()
ExoPlayer Verwende SimpleExoPlayer.setVolume(), um die Lautstärke des zugrunde liegenden Audiotracks einzustellen.

Machen Sie sich keine Gedanken

Nutzer haben eine Reihe von Alternativen zur Audiowiedergabe über ihre Android-Geräte. Die meisten Geräte haben einen integrierten Lautsprecher und Kopfhöreranschlüsse für kabelgebundene Headsets. Viele Geräte bieten auch Bluetooth-Konnektivität und Unterstützung für A2DP-Audio.

Wenn ein Headset oder ein Bluetooth-Gerät getrennt werden, wird der Audiostream automatisch an den integrierten Lautsprecher weitergeleitet. Wenn Sie Musik in hoher Lautstärke hören, kann das eine Überraschung sein.

Nutzer erwarten in der Regel, dass Apps mit einem Musikplayer mit Wiedergabesteuerung auf dem Bildschirm die Wiedergabe in diesem Fall pausieren. Andere Apps wie Spiele ohne Bedienung sollen weiterhin spielen. Der Nutzer kann die Lautstärke über die Hardware-Steuerelemente des Geräts anpassen.

Wenn die Audioausgabe wieder zum integrierten Lautsprecher wechselt, sendet das System einen ACTION_AUDIO_BECOMING_NOISY-Intent. Sie sollten einen BroadcastReceiver erstellen, der bei jeder Audiowiedergabe auf diesen Intent wartet. Der Empfänger sollte so aussehen:

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
      }
    }
}

Registrieren Sie den Empfänger, wenn Sie die Wiedergabe starten, und heben Sie die Registrierung auf, wenn Sie die Wiedergabe beenden. Wenn du deine App wie in diesem Leitfaden beschrieben entwickelst, sollten diese Aufrufe in den Mediensitzungs-Callbacks onPlay() und onStop() erscheinen.

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