AudioFocusRequestClass Klasse

Definition

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

[Android.Runtime.Register("android/media/AudioFocusRequest", ApiSince=26, DoNotGenerateAcw=true)]
public sealed class AudioFocusRequestClass : Java.Lang.Object
[<Android.Runtime.Register("android/media/AudioFocusRequest", ApiSince=26, DoNotGenerateAcw=true)>]
type AudioFocusRequestClass = class
    inherit Object
Vererbung
AudioFocusRequestClass
Attribute

Hinweise

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung. Ein AudioFocusRequest instance wird von Buildererstellt und verwendet, um den Audiofokus anzufordern bzw. zu verwerfen, bzw. mit AudioManager#requestAudioFocus(AudioFocusRequest) und AudioManager#abandonAudioFocusRequest(AudioFocusRequest).

<h3>Was ist der Audiofokus?</h3>

Audiofokus ist ein Konzept, das in API 8 eingeführt wurde. Es wird verwendet, um zu vermitteln, dass sich ein Nutzer immer nur auf einen einzelnen Audiostream konzentrieren kann, z.B. musikhören oder einen Podcast, aber nicht beide gleichzeitig. In einigen Fällen können mehrere Audiostreams gleichzeitig wiedergegeben werden, aber es gibt nur einen, auf den der Benutzer wirklich hören würde (fokussiere), während der andere im Hintergrund wiedergegeben wird. Ein Beispiel hierfür ist das Sprechen von Wegbeschreibungen, während Musik mit einer reduzierten Lautstärke (auch als Ducking bezeichnet) wiedergegeben wird.

Wenn eine Anwendung den Audiofokus anfordert, drückt sie ihre Absicht aus, den Audiofokus für die Wiedergabe von Audio zu "besitzen". Sehen wir uns die verschiedenen Arten von Fokusanforderungen, den Rückgabewert nach einer Anforderung und die Antworten auf einen Verlust an. <p class="note">Hinweis: Anwendungen sollten nichts wiedergeben, bis der Fokus gewährt wird.

<h3>Die verschiedenen Arten von Fokusanforderungen</h3>

Es gibt vier Fokusanforderungstypen. Eine erfolgreiche Fokusanforderung mit jeder ergibt unterschiedliche Verhaltensweisen des Systems und der anderen Anwendung, die zuvor den Audiofokus hatte. <ul><li>AudioManager#AUDIOFOCUS_GAIN drückt aus, dass Ihre Anwendung jetzt die einzige Audioquelle ist, die der Benutzer anhört. Die Dauer der Audiowiedergabe ist unbekannt und möglicherweise sehr lang: Nachdem der Benutzer die Interaktion mit Ihrer Anwendung beendet hat, erwartet er nicht, dass ein weiterer Audiodatenstrom fortgesetzt wird. Beispiele für die Verwendung dieses Fokusgewinns sind für die Musikwiedergabe, für ein Spiel oder einen Videoplayer.</Li>

<li>AudioManager#AUDIOFOCUS_GAIN_TRANSIENT ist für eine Situation, in der Sie wissen, dass Ihre Anwendung vorübergehend den Fokus vom aktuellen Besitzer erhält, aber der Benutzer erwartet, dass die Wiedergabe wieder an den Ort zurückgeht, an dem sie war, nachdem Ihre Anwendung den Audiofokus nicht mehr benötigt. Ein Beispiel hierfür ist das Abspielen eines Alarms oder während eines VoIP-Anrufs. Die Wiedergabe ist bekanntlich endlich: Der Alarm wird timeout oder wird geschlossen, der VoIP-Anruf hat einen Anfang und ein Ende. Wenn eines dieser Ereignisse endet und der Benutzer musikhörte, wenn es gestartet wurde, erwartet der Benutzer, dass die Musik fortgesetzt wird, aber er wollte nicht beides gleichzeitig hören.</Li>

<li>AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK: Dieser Fokusanforderungstyp ähnelt AUDIOFOCUS_GAIN_TRANSIENT dem für den temporären Aspekt der Fokusanforderung, drückt aber auch die Tatsache aus, während der Zeit, in der Sie den Fokus besitzen, können Sie einer anderen Anwendung erlauben, mit einer reduzierten Lautstärke zu spielen, "entent". Beispiele für die Wiedergabe von Wegbeschreibungen oder Benachrichtigungen sind, dass Musik weiterhin wiedergegeben wird, aber nicht laut genug, um zu verhindern, dass die Anweisungen schwer zu verstehen sind. Eine typische Dämpfung durch die "entente" Anwendung ist ein Faktor von 0,2f (oder -14dB), der für instance angewendet werden kann, wenn diese Klasse für die Wiedergabe verwendet MediaPlayer.setVolume(0.2f) wird.</Li>

<li>AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE ist auch für eine vorübergehende Anforderung vorgesehen, drückt aber auch aus, dass Ihre Anwendung erwartet, dass das Gerät nichts anderes abspielt. Dies wird in der Regel verwendet, wenn Sie Audioaufzeichnungen oder Spracherkennungen durchführen und während dieser Zeit keine Beispielbenachrichtigungen vom System wiedergegeben werden sollen.</li></ul>

Ein AudioFocusRequest instance enthält immer einen der vier oben erläuterten Arten von Anforderungen. Es wird übergeben, wenn ein AudioFocusRequest instance mit seinem Generator im Builder Konstruktor AudioFocusRequest.Builder#Builder(int)erstellt wird, oder mit AudioFocusRequest.Builder#setFocusGain(int) nach dem Kopieren eines vorhandenen instance mit AudioFocusRequest.Builder#Builder(AudioFocusRequest).

<h3>Qualifizieren Ihrer Fokusanforderung</h3><h4>Anwendungsfall, der eine Fokusanforderung< erfordert/h4>

Jede Fokusanforderung wird durch den (siehe Builder#setAudioAttributes(AudioAttributes)) qualifiziert, der AudioAttributes den Audioanwendungsfall beschreibt, der der Anforderung folgt (sobald sie erfolgreich ist oder gewährt wird). Es wird empfohlen, für die Anforderung dasselbe AudioAttributes zu verwenden wie die Attribute, die Sie für die Audio-/Medienwiedergabe verwenden. <br>Wenn keine Attribute festgelegt sind, werden Standardattribute von AudioAttributes#USAGE_MEDIA verwendet.

<h4>Verzögerter Fokus</h4>

Der Audiofokus kann aus verschiedenen Gründen vom System "gesperrt" werden: während eines Telefonanrufs, wenn das Auto, mit dem das Gerät verbunden ist, eine Notmeldung abgibt... Um diese Situationen zu unterstützen, kann die Anwendung anfordern, dass sie benachrichtigt wird, wenn ihre Anforderung erfüllt ist, indem sie ihre Anforderung als verzögerten Fokus akzeptiert, und zwar mit Builder#setAcceptsDelayedFocusGain(boolean). <br>Wenn der Fokus angefordert wird, während vom System gesperrt wird, AudioManager#requestAudioFocus(AudioFocusRequest) gibt zurück AudioManager#AUDIOFOCUS_REQUEST_DELAYED. Wenn der Fokus nicht mehr gesperrt ist, wird der Fokuslistener, der mit Builder#setOnAudioFocusChangeListener(OnAudioFocusChangeListener) oder mit Builder#setOnAudioFocusChangeListener(OnAudioFocusChangeListener, Handler) festgelegt ist, aufgerufen, um die Anwendung zu benachrichtigen, die jetzt über den Audiofokus verfügt.

<h4>Pausing vs Ducking</h4>

Wenn eine Anwendung den Audiofokus mit AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCKangefordert hat, entent das System den aktuellen Fokusbesitzer. <p class="note">Hinweis: Dieses Verhalten ist <b>neu für Android O</b>, während Anwendungen, die auf SDK-Ebene bis API 25 abzielen, das Ducking selbst implementieren mussten, wenn sie einen Fokusverlust von erhielten AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK.

Ducking ist jedoch nicht immer das Verhalten, das der Benutzer erwartet. Ein typisches Beispiel ist, wenn das Gerät Wegbeschreibungen wiedergibt, während der Benutzer ein Hörbuch oder einen Podcast anhört und erwartet, dass die Audiowiedergabe angehalten wird, anstatt enten, da es schwierig ist, eine Navigationsaufforderung und gesprochene Inhalte gleichzeitig zu verstehen. Daher wird das System nicht automatisch ducken, wenn es erkennt, dass es gesprochenen Inhalt entent: Solche Inhalte werden erkannt, wenn die AudioAttributes des Spielers von AudioAttributes#CONTENT_TYPE_SPEECHqualifiziert werden. Weitere Informationen finden Sie unter instance und AudioAttributes.Builder#setContentType(int)MediaPlayer#setAudioAttributes(AudioAttributes) wenn Sie eine Medienwiedergabeanwendung für Hörbücher, Podcasts schreiben... Da das System Anwendungen, die Sprache wiedergeben, nicht automatisch entent, ruft es stattdessen ihren Fokuslistener auf, um sie AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCKdarüber zu benachrichtigen, sodass sie stattdessen anhalten können. Beachten Sie, dass dieses Verhalten unabhängig von der Verwendung von AudioFocusRequestist, aber an die Verwendung von AudioAttributesgebunden ist.

Wenn Ihre Anwendung aus einem anderen Grund als der Sprachwiedergabe angehalten statt geduscht werden muss, können Sie dies auch mit Builder#setWillPauseWhenDucked(boolean)deklarieren, was dazu führt, dass das System Ihren Fokuslistener aufruft, anstatt automatisch zu ducken.

<h4-Beispiel></h4>

Im folgenden Beispiel werden die folgenden Schritte behandelt, die in jeder Anwendung zu finden sind, die Audio wiedergeben und den Audiofokus verwenden würde. Hier spielen wir ein Hörbuch ab, und unsere Anwendung dient eher zum Anhalten als zum Enten, wenn sie den Fokus verliert. Diese Schritte bestehen aus: <ul><li>CreatingAudioAttributes, das für die Wiedergabe und die Fokusanforderung verwendet werden soll.</li><li>: Konfigurieren und Erstellen der AudioFocusRequest instance, die das beabsichtigte Fokusverhalten definiert.</li><li>Fordert den Audiofokus an und überprüft den Rückgabecode, um festzustellen, ob die Wiedergabe sofort erfolgen kann oder verzögert wird.</li><li>Implementieren eines Fokusänderungslisteners, um auf Fokusgewinne und -verluste zu reagieren.</li></ul>

// initialization of the audio attributes and focus request
            mAudioManager = (AudioManager) Context.getSystemService(Context.AUDIO_SERVICE);
            mPlaybackAttributes = new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                    .build();
            mFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
                    .setAudioAttributes(mPlaybackAttributes)
                    .setAcceptsDelayedFocusGain(true)
                    .setWillPauseWhenDucked(true)
                    .setOnAudioFocusChangeListener(this, mMyHandler)
                    .build();
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setAudioAttributes(mPlaybackAttributes);
            final Object mFocusLock = new Object();

            boolean mPlaybackDelayed = false;

            // requesting audio focus
            int res = mAudioManager.requestAudioFocus(mFocusRequest);
            synchronized (mFocusLock) {
                if (res == AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
                    mPlaybackDelayed = false;
                } else if (res == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
                    mPlaybackDelayed = false;
                    playbackNow();
                } else if (res == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) {
                   mPlaybackDelayed = true;
                }
            }

            // implementation of the OnAudioFocusChangeListener
            &#64;Override
            public void onAudioFocusChange(int focusChange) {
                switch (focusChange) {
                    case AudioManager.AUDIOFOCUS_GAIN:
                        if (mPlaybackDelayed || mResumeOnFocusGain) {
                            synchronized (mFocusLock) {
                                mPlaybackDelayed = false;
                                mResumeOnFocusGain = false;
                            }
                            playbackNow();
                        }
                        break;
                    case AudioManager.AUDIOFOCUS_LOSS:
                        synchronized (mFocusLock) {
                            // this is not a transient loss, we shouldn't automatically resume for now
                            mResumeOnFocusGain = false;
                            mPlaybackDelayed = false;
                        }
                        pausePlayback();
                        break;
                    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                        // we handle all transient losses the same way because we never duck audio books
                        synchronized (mFocusLock) {
                            // we should only resume if playback was interrupted
                            mResumeOnFocusGain = mMediaPlayer.isPlaying();
                            mPlaybackDelayed = false;
                        }
                        pausePlayback();
                        break;
                }
            }

            // Important:
            // Also set "mResumeOnFocusGain" to false when the user pauses or stops playback: this way your
            // application doesn't automatically restart when it gains focus, even though the user had
            // stopped it.

Java-Dokumentation für android.media.AudioFocusRequest.

Teile dieser Seite sind Änderungen, die auf Arbeiten basieren, die vom Android Open Source Project erstellt und freigegeben wurden und gemäß den In Attribution License beschriebenen Begriffen verwendet werden.

Eigenschaften

AudioAttributes

Gibt den AudioAttributes Satz für dieses AudioFocusRequestzurück, oder die Standardattribute, wenn keine festgelegt wurden.

Class

Gibt die Laufzeitklasse dieses Objectzurück.

(Geerbt von Object)
FocusGain

Gibt den Typ der Audiofokusanforderung zurück, die für diese AudioFocusRequestkonfiguriert ist.

Handle

Das Handle für die zugrunde liegende Android-instance.

(Geerbt von Object)
JniIdentityHashCode

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von Object)
JniPeerMembers

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

PeerReference

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von Object)
ThresholdClass

Diese API unterstützt die Mono für Android-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen.

(Geerbt von Object)
ThresholdType

Diese API unterstützt die Mono für Android-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen.

(Geerbt von Object)

Methoden

AcceptsDelayedFocusGain()

Gibt zurück, ob die Anwendung, die dies AudioFocusRequest verwenden würde, einen Fokusgewinn unterstützt, der nach einem Fehler bei einer temporären Anforderung gewährt wird.

Clone()

Erstellt und gibt eine Kopie dieses Objekts zurück.

(Geerbt von Object)
Dispose()

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von Object)
Dispose(Boolean)

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von Object)
Equals(Object)

Gibt an, ob ein anderes Objekt "gleich" diesem objekt ist.

(Geerbt von Object)
GetHashCode()

Gibt einen Hashcodewert für das Objekt zurück.

(Geerbt von Object)
JavaFinalize()

Wird vom Garbage Collector für ein Objekt aufgerufen, wenn die Garbage Collection feststellt, dass keine Verweise mehr auf das Objekt vorhanden sind.

(Geerbt von Object)
Notify()

Aktiviert einen einzelnen Thread, der auf den Monitor dieses Objekts wartet.

(Geerbt von Object)
NotifyAll()

Aktiviert alle Threads, die auf den Monitor dieses Objekts warten.

(Geerbt von Object)
SetHandle(IntPtr, JniHandleOwnership)

Legt die Handle-Eigenschaft fest.

(Geerbt von Object)
ToArray<T>()

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von Object)
ToString()

Gibt eine Zeichenfolgendarstellung des Objekts zurück.

(Geerbt von Object)
UnregisterFromRuntime()

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von Object)
Wait()

Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert ist, in der Regel durch <>Benachrichtigung</em> oder <em>interrupted</em>.

(Geerbt von Object)
Wait(Int64)

Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert ist, in der Regel durch>< Benachrichtigung</em> oder <em>interrupted</em>, oder bis eine bestimmte Menge an Echtzeit verstrichen ist.

(Geerbt von Object)
Wait(Int64, Int32)

Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert ist, in der Regel durch>< Benachrichtigung</em> oder <em>interrupted</em>, oder bis eine bestimmte Menge an Echtzeit verstrichen ist.

(Geerbt von Object)
WillPauseWhenDucked()

Gibt zurück, ob die Anwendung, die dies AudioFocusRequest verwenden würde, angehalten würde, wenn angefordert wird, zu enten.

Explizite Schnittstellenimplementierungen

IJavaPeerable.Disposed()

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von Object)
IJavaPeerable.DisposeUnlessReferenced()

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von Object)
IJavaPeerable.Finalized()

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von Object)
IJavaPeerable.JniManagedPeerState

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von Object)

Erweiterungsmethoden

JavaCast<TResult>(IJavaObject)

Führt eine Typkonvertierung mit Überprüfung der Android-Laufzeit aus.

JavaCast<TResult>(IJavaObject)

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

GetJniTypeName(IJavaPeerable)

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

Gilt für: