AudioFocusRequestClass Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
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
- Attribute
Hinweise
Eine Klasse zum Kapseln von Informationen zu einer Audiofokusanforderung. Ein AudioFocusRequest
instance wird von Builder
erstellt 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_DUCK
angefordert 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_SPEECH
qualifiziert 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_DUCK
darüber zu benachrichtigen, sodass sie stattdessen anhalten können. Beachten Sie, dass dieses Verhalten unabhängig von der Verwendung von AudioFocusRequest
ist, aber an die Verwendung von AudioAttributes
gebunden 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
@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 |
Class |
Gibt die Laufzeitklasse dieses |
FocusGain |
Gibt den Typ der Audiofokusanforderung zurück, die für diese |
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 |
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 |
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. |