Sprache

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. Es wird eine AudioFocusRequest Instanz erstellt Builder, die verwendet wird, um den Audiofokus bzw. den AudioManager#requestAudioFocus(AudioFocusRequest) Audiofokus anzufordern und AudioManager#abandonAudioFocusRequest(AudioFocusRequest)aufzugeben.

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

Der Audiofokus ist ein Konzept, das in API 8 eingeführt wurde. Es wird verwendet, um die Tatsache zu vermitteln, dass sich ein Benutzer nur auf einen einzelnen Audiostream gleichzeitig konzentrieren kann, z. B. Musik oder Podcast hören, aber nicht beide gleichzeitig. In einigen Fällen können mehrere Audiodatenströme gleichzeitig wiedergegeben werden, aber es gibt nur einen Benutzer, der sich wirklich anhört (fokussiert), während die andere im Hintergrund wiedergegeben wird. Ein Beispiel hierfür ist das Sprechen von Wegbeschreibungen, während Musik bei einer reduzierten Lautstärke (z.B. Enten) wiedergegeben wird.

Wenn eine Anwendung den Audiofokus anfordert, drückt sie ihre Absicht aus, den Audiofokus "zu besitzen", um Audio wiederzugeben. Sehen wir uns die verschiedenen Arten von Fokusanforderungen, den Rückgabewert nach einer Anforderung und die Antworten auf einen Verlust an.

Hinweis: Anwendungen sollten nichts wiedergeben, bis der Fokus gewährt wurde.

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

Es gibt vier Fokusanforderungstypen. Eine erfolgreiche Fokusanforderung mit jedem führt zu unterschiedlichen Verhaltensweisen durch das System und die andere Anwendung, die zuvor den Audiofokus gehalten hat. <ul><li>AudioManager#AUDIOFOCUS_GAIN drückt die Tatsache aus, dass Ihre Anwendung jetzt die einzige Quelle von Audio ist, die der Benutzer hört. Die Dauer der Audiowiedergabe ist unbekannt und ist möglicherweise sehr lang: Nachdem der Benutzer die Interaktion mit Ihrer Anwendung abgeschlossen hat, erwartet er nicht, dass ein anderer 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, wenn Sie wissen, dass Ihre Anwendung vorübergehend den Fokus des aktuellen Besitzers nimmt, aber der Benutzer erwartet, dass die Wiedergabe wieder an die Stelle zurückkehrt, an der die Anwendung nicht mehr den Audiofokus benötigt. Ein Beispiel hierfür ist die Wiedergabe eines Alarms oder während eines VoIP-Anrufs. Die Wiedergabe ist als endlich bekannt: Der Alarm wird timeout oder geschlossen, der VoIP-Anruf hat einen Anfang und ein Ende. Wenn eines dieser Ereignisse endet und der Benutzer beim Start Musik hört, erwartet der Benutzer, dass die Musik fortgesetzt wird, aber nicht gleichzeitig beides hören wollte.</li>

<li>AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK: Dieser Fokusanforderungstyp ist AUDIOFOCUS_GAIN_TRANSIENT ähnlich wie für den temporären Aspekt der Fokusanforderung, aber es drückt auch die Tatsache während der Zeit aus, in der Sie den Fokus besitzen, sie erlauben einer anderen Anwendung, auf einem reduzierten Volumen zu spielen, "entent". Beispiele sind beim Wiedergeben von Wegbeschreibungen oder Benachrichtigungen, es ist ok, dass Musik weiterhin wiedergegeben wird, aber nicht laut genug, damit die Wegbeschreibungen schwer zu verstehen sind. Eine typische Dämpfung durch die "entente" Anwendung ist ein Faktor von 0,2f (oder -14dB), der beispielsweise bei MediaPlayer.setVolume(0.2f) Verwendung dieser Klasse für die Wiedergabe angewendet werden kann.</li>

<li>AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE ist auch für eine temporäre Anforderung vorgesehen, gibt aber auch an, dass Ihre Anwendung erwartet, dass das Gerät nichts anderes wiedergeben wird. Dies wird in der Regel verwendet, wenn Sie Audioaufzeichnung oder Spracherkennung durchführen und nicht möchten, dass Beispiele für Benachrichtigungen vom System während dieser Zeit wiedergegeben werden.</li></ul>

Eine AudioFocusRequest Instanz enthält immer einen der vier oben erläuterten Anforderungstypen. Sie wird beim Erstellen einer AudioFocusRequest Instanz mit dem Generator im Builder Konstruktor AudioFocusRequest.Builder#Builder(int)oder beim AudioFocusRequest.Builder#setFocusGain(int) Kopieren einer vorhandenen Instanz mit AudioFocusRequest.Builder#Builder(AudioFocusRequest)übergeben.

"hinweis"><b>Hinweis:</b> Wenn eine App auf Android 15 (API-Ebene 35) oder höher ausgerichtet ist, kann der Audiofokus nur angefordert werden, wenn es sich um die obere App oder das Ausführen eines Vordergrunddiensts handelt. Diese Anforderung ähnelt den Anforderungen für die Audiowiedergabe. Wenn eine App den Audiofokus anfordert, wenn sie diese Anforderungen nicht erfüllt, gibt die Methode "c>AudioManager#AUDIOFOCUS_REQUEST_FAILED</c>" zurück<. </aside>

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

Jede Fokusanforderung wird durch den AudioAttributes (siehe Builder#setAudioAttributes(AudioAttributes)) qualifiziert, der den Audioanwendungsfall beschreibt, der der Anforderung folgt (sobald sie erfolgreich oder erteilt wurde). Es wird empfohlen, für die Anforderung das gleiche AudioAttributes wie die Attribute zu verwenden, die Sie für die Audio-/Medienwiedergabe verwenden. <br>If no attributes are set, default attributes of AudioAttributes#USAGE_MEDIA are used.

<h4>Verzögerter Fokus</h4>

Der Audiofokus kann aus verschiedenen Gründen vom System "gesperrt" werden: während eines Telefonanrufs, wenn das Fahrzeug, mit dem das Gerät verbunden ist, eine Notrufnachricht abgibt... Um diese Situationen zu unterstützen, kann die Anwendung anfordern, benachrichtigt zu werden, wenn ihre Anforderung erfüllt ist, indem sie ihre Anforderung als akzeptiert verzögerten Fokus Builder#setAcceptsDelayedFocusGain(boolean)mit gekennzeichnet. <br>Wenn der Fokus beim Sperren durch das System angefordert wird, AudioManager#requestAudioFocus(AudioFocusRequest) wird zurückgegeben AudioManager#AUDIOFOCUS_REQUEST_DELAYED. Wenn der Fokus nicht mehr gesperrt ist, wird der Fokushörer, der mit Builder#setOnAudioFocusChangeListener(OnAudioFocusChangeListener) oder mit Builder#setOnAudioFocusChangeListener(OnAudioFocusChangeListener, Handler) dem Fokus festgelegt ist, aufgerufen, um die Anwendung zu benachrichtigen, die jetzt den Audiofokus besitzt.

<h4>Anhalten vs Enten</h4>

Wenn eine Anwendung den Audiofokus angefordert hat AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, entt das System den aktuellen Fokusbesitzer.

Hinweis: Dieses Verhalten ist <für>Android O</b> neu, während Anwendungen, die auf SDK-Ebene bis API 25 abzielen, das Enten selbst implementieren mussten, wenn sie einen Fokusverlust AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCKerhalten haben.

Aber Enten ist nicht immer das Verhalten, das der Benutzer erwartet. Ein typisches Beispiel ist, wenn das Gerät Wegbeschreibungen wiedergibt, während der Benutzer ein Audiobuch oder Podcast hört und erwartet, dass die Audiowiedergabe angehalten wird, anstatt enten, da es schwer ist, eine Navigationsaufforderung und gesprochenen Inhalte gleichzeitig zu verstehen. Das System ente sich daher nicht automatisch, wenn es erkennt, dass er gesprochenen Inhalt enten würde: Solche Inhalte werden erkannt, wenn der AudioAttributes Spieler qualifiziert AudioAttributes#CONTENT_TYPE_SPEECHist. Verweisen Sie beispielsweise auf AudioAttributes.Builder#setContentType(int) und MediaPlayer#setAudioAttributes(AudioAttributes) wenn Sie eine Medienwiedergabeanwendung für Hörbuch, Podcasts schreiben... Da das System anwendungen, die Sprache wiedergeben, nicht automatisch enten wird, ruft es stattdessen den Fokushörer auf, um sie AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCKzu benachrichtigen, damit sie stattdessen angehalten werden können. Beachten Sie, dass dieses Verhalten unabhängig von der Verwendung von AudioFocusRequest, aber an die Verwendung gebunden AudioAttributesist.

Wenn Ihre Anwendung aus irgendeinem anderen Grund als der Sprachwiedergabe pausieren muss, können Sie dies auch deklarieren Builder#setWillPauseWhenDucked(boolean), was dazu führt, dass das System Ihren Fokushörer aufruft, anstatt automatisch zu enten.

<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, und unsere Anwendung soll angehalten werden, anstatt 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 Instanz, 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änderungs-Listeners, 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 auf der Grundlage von Arbeiten, die von der Android Open Source Project erstellt und gemeinsam verwendet und gemäß den in der 2.5 Attribution License beschriebenen Begriffen verwendet werden.

Eigenschaften

Name Beschreibung
AudioAttributes

Gibt den AudioAttributes Satz für diesen AudioFocusRequestWert oder die Standardattribute zurück, wenn keine festgelegt wurden.

Class

Gibt die Laufzeitklasse dieses Werts Objectzurück.

(Geerbt von Object)
FocusGain

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

Handle

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

(Geerbt von Object)
JniIdentityHashCode

Ruft den Identitätshashcode ab, der diesem Java Peer von der Interop-Laufzeit zugewiesen ist.

(Geerbt von Object)
JniManagedPeerState

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von JavaObject)
JniPeerMembers

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

PeerReference

Ruft den JNI-Objektverweis für diesen Java Peer ab.

(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

Name Beschreibung
AcceptsDelayedFocusGain()

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

Clone()

Erstellt und gibt eine Kopie dieses Objekts zurück.

(Geerbt von Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von JavaObject)
Dispose()

Veröffentlicht die Ressourcen, die von diesem Java Peer gehalten werden.

(Geerbt von Object)
Dispose(Boolean)

Veröffentlicht die Ressourcen, die von diesem Java Peer gehalten werden.

(Geerbt von Object)
DisposeUnlessReferenced()

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von JavaObject)
Equals(Object)

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von JavaObject)
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 bestimmt, dass keine weiteren Verweise auf das Objekt vorhanden sind.

(Geerbt von Object)
Notify()

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

(Geerbt von Object)
NotifyAll()

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

(Geerbt von Object)
SetHandle(IntPtr, JniHandleOwnership)

Legt die Handle-Eigenschaft fest.

(Geerbt von Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von JavaObject)
ToArray<T>()

Erstellt ein verwaltetes Array aus diesem Java Arraywrapper.

(Geerbt von Object)
ToString()

Gibt eine Zeichenfolgendarstellung des Objekts zurück.

(Geerbt von Object)
UnregisterFromRuntime()

Hebt die Registrierung dieses Java Peers aus der Interop-Laufzeit auf.

(Geerbt von Object)
Wait()

Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch em benachrichtigt/em< oder >em<unterbrochen>/em<.><>

(Geerbt von Object)
Wait(Int64, Int32)

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

(Geerbt von Object)
Wait(Int64)

Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch <em>benachrichtigt</em> oder <em>unterbrochen</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 sie zum Enten angefordert wird.

Explizite Schnittstellenimplementierungen

Name Beschreibung
IJavaPeerable.Disposed()

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von JavaObject)
IJavaPeerable.Finalized()

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

(Geerbt von JavaObject)

Erweiterungsmethoden

Name Beschreibung
GetJniTypeName(IJavaPeerable)

Ruft den JNI-Namen des Typs der Instanz selfab.

JavaAs<TResult>(IJavaPeerable)

Versuchen Sie, die Eingabe selfzu TResult erzwingen, und überprüfen Sie, ob die Koersion auf der Java Seite gültig ist.

JavaCast<TResult>(IJavaObject)

Führt eine android-laufzeitgecheckte Typkonvertierung aus.

JavaCast<TResult>(IJavaObject)

Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung.

TryJavaCast<TResult>(IJavaPeerable, TResult)

Versuchen Sie, die Eingabe selfzu TResult erzwingen, und überprüfen Sie, ob die Koersion auf der Java Seite gültig ist.

Gilt für: