Steuerung der Audioausgabe ermöglichen

Nutzer erwarten, dass sie die Lautstärke einer Audio-App steuern können. Das Standardverhalten umfasst die Möglichkeit, die Lautstärkeregler zu verwenden (entweder Tasten oder Regler auf dem Gerät oder Schieberegler in der Benutzeroberfläche) und zu verhindern, dass die Wiedergabe plötzlich laut wird, wenn ein Peripheriegerät wie Kopfhörer während der Verwendung getrennt wird.

Lautstärkeregelung verwenden

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

Android verwendet separate Audiostreams für die Wiedergabe von Musik, Weckern, Benachrichtigungen, Klingeltönen für eingehende Anrufe, Systemtönen, Anruflautstärke und DTMF-Tönen. So können Nutzer die Lautstärke jedes Streams unabhängig voneinander regeln.

Wenn Sie den Lautstärkeregler drücken, wird standardmäßig die Lautstärke des aktiven Audiostreams geändert. Wenn in Ihrer App gerade nichts abgespielt wird, wird durch Drücken der Lautstärketasten die Musiklautstärke (vor Android 9 die Klingeltonlautstärke) angepasst.

Sofern es sich bei Ihrer App nicht um einen Wecker handelt, sollten Sie Audioinhalte mit der Nutzungsstufe AudioAttributes.USAGE_MEDIA wiedergeben.

Damit die Lautstärkeregler den richtigen Stream anpassen, solltest du setVolumeControlStream() aufrufen und dabei den Streamtyp angeben, der deinen Attributen entspricht, die du aus AudioAttributes.getVolumeControlStream abrufen kannst.

Kotlin

setVolumeControlStream(AudioManager.STREAM_MUSIC)

Java

setVolumeControlStream(AudioManager.STREAM_MUSIC);

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

Streamlautstärke programmatisch steuern

In seltenen Fällen kannst du die Lautstärke eines Audiostreams programmatisch festlegen. Beispielsweise, wenn Ihre App eine vorhandene Benutzeroberfläche ersetzt. Dies wird nicht empfohlen, da die Android-AudioManager alle Audiostreams desselben Typs zusammenmischt. Mit diesen Methoden wird die Lautstärke aller Apps geändert, die den Stream verwenden. Vermeiden Sie Folgendes:

Mit Geräten mit festem Speicherplatz arbeiten

Einige Geräte (z. B. Chromebooks und Autos mit Android Automotive OS) haben zwar eine Lautstärkeregelung, aber Apps können die Lautstärke eines Audiostreams nicht mit den oben beschriebenen AudioManager-Methoden ändern. Diese Geräte werden als Geräte mit fester Lautstärke bezeichnet. Ob Ihre App auf einem Gerät mit fester Lautstärke ausgeführt wird, können Sie herausfinden, indem Sie isVolumeFixed() aufrufen.

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 verbinden:

Spieler Method
AudioTrack AudioTrack.setVolume()
MediaPlayer MediaPlayer.setVolume()
ExoPlayer Verwende SimpleExoPlayer.setVolume(), um die Lautstärke des zugrunde liegenden Audiotracks festzulegen.
Web Legen Sie die Property volume des HTMLMediaElement fest.

Seien Sie nicht zu laut.

Nutzer haben verschiedene Möglichkeiten, Audioinhalte auf ihren Android-Geräten abzuspielen. Die meisten Geräte haben einen integrierten Lautsprecher und Kopfhörerbuchsen für kabelgebundene Headsets. Viele bieten auch Bluetooth-Konnektivität und Unterstützung für A2DP-Audio.

Wenn ein Headset getrennt oder eine Bluetooth-Verbindung getrennt wird, wird der Audiostream automatisch an den integrierten Lautsprecher weitergeleitet. Wenn Sie Musik in hoher Lautstärke hören, kann das eine laute Ü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, z. B. Spiele ohne Steuerelemente, sollten weiter ausgeführt werden. Der Nutzer kann die Lautstärke über die Hardwaresteuerung des Geräts anpassen.

Wenn die Audioausgabe wieder auf den integrierten Lautsprecher umgestellt wird, sendet das System eine ACTION_AUDIO_BECOMING_NOISY-Intent. Sie sollten einen BroadcastReceiver erstellen, der bei der Wiedergabe von Audioinhalten auf diesen Intent achtet. 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 sie beenden. Wenn Sie Ihre App wie in diesem Leitfaden beschrieben entwerfen, sollten diese Aufrufe in den onPlay()- und onStop()-Callbacks der Mediensitzung 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);
  }
}