AudioFocusRequestClass 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
一个类,用于封装有关音频焦点请求的信息。
[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
- 继承
- 属性
注解
一个类,用于封装有关音频焦点请求的信息。 实例 AudioFocusRequest
由 Builder
生成,用于分别使用 AudioManager#requestAudioFocus(AudioFocusRequest)
AudioManager#abandonAudioFocusRequest(AudioFocusRequest)
和 请求和放弃音频焦点。
<h3>什么是音频焦点?</h3>
音频焦点是 API 8 中引入的概念。 它用于传达这样一个事实,即用户一次只能专注于单个音频流,例如听音乐或播客,但不能同时两者。 在某些情况下,可以同时播放多个音频流,但只有一个用户真正会收听, (专注于) ,而另一个流在后台播放。 例如,当音乐以降低音量播放时, (躲避) 时,驾驶说出方向。
当应用程序请求音频焦点时,它表示其意图是“拥有”音频焦点以播放音频。 让我们回顾一下不同类型的焦点请求、请求后的返回值以及对丢失的响应。 <p class=“note”>注意:在授予焦点之前,应用程序不应播放任何内容。
<h3>不同类型的焦点请求</h3>
有四种焦点请求类型。 每个请求成功的焦点请求将产生系统以及之前持有音频焦点的其他应用程序的不同行为。 <ul><li>AudioManager#AUDIOFOCUS_GAIN
表示,应用程序现在是用户正在收听的唯一音频源。 音频播放的持续时间未知,并且可能很长:在用户完成与应用程序交互后, () 他预计不会恢复其他音频流。 此焦点增益的用法示例包括用于音乐播放、游戏或视频播放器。</李>
<li>AudioManager#AUDIOFOCUS_GAIN_TRANSIENT
适用于以下情况:你知道应用程序正在暂时从当前所有者那里获取焦点,但用户希望在应用程序不再需要音频焦点后,播放将返回到它所在的位置。 例如,播放闹钟或在 VoIP 呼叫期间播放。 已知播放是有限的:警报将超时或消除,VoIP 呼叫有开始和结束。 当其中任何一个事件结束时,如果用户在启动时正在听音乐,则用户希望音乐恢复,但不希望同时收听这两种音乐。</李>
<li>AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
:此焦点请求类型类似于 AUDIOFOCUS_GAIN_TRANSIENT
焦点请求的临时方面,但它也表达了这样一个事实:在你自己的焦点期间,你允许另一个应用程序继续以减小的音量播放,“躲避”。 例如,在播放驾驶路线或通知时,音乐可以继续播放,但音量不够大,导致方向难以理解。 “躲避”应用程序的典型衰减是 0.2f (或 -14dB) ,例如,在使用此类进行播放时,可以使用 来应用 MediaPlayer.setVolume(0.2f)
。</李>
<li>AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE
也用于临时请求,但也表示应用程序希望设备不播放任何其他内容。 如果你正在进行音频录制或语音识别,并且不希望在此期间系统播放示例通知,则通常会使用此方法。</li></ul>
实例 AudioFocusRequest
始终包含上述四种类型的请求之一。 在构造函数 AudioFocusRequest.Builder#Builder(int)
中使用Builder
其生成器生成AudioFocusRequest
实例时,或者在使用 AudioFocusRequest.Builder#setFocusGain(int)
复制现有实例后传递AudioFocusRequest.Builder#Builder(AudioFocusRequest)
它。
<h3>限定焦点请求</h3><h4>需要焦点请求<的用例/h4>
任何焦点请求都由 AudioAttributes
(查看 Builder#setAudioAttributes(AudioAttributes)
描述成功或授予) 后将遵循请求 (的音频用例的) 。 建议对请求使用与用于音频/媒体播放的属性相同的 AudioAttributes
。 <br>如果未设置任何属性,则使用 的默认属性 AudioAttributes#USAGE_MEDIA
。
<h4>延迟焦点</h4>
音频焦点可能由系统“锁定”,原因有很多:在电话呼叫期间,当设备连接到的汽车播放紧急消息时...。为了支持这些情况,应用程序可以请求在满足其请求时收到通知,方法是将其请求标记为接受延迟焦点,使用 Builder#setAcceptsDelayedFocusGain(boolean)
。 <br>如果在系统锁定时请求焦点, AudioManager#requestAudioFocus(AudioFocusRequest)
将返回 AudioManager#AUDIOFOCUS_REQUEST_DELAYED
。 当焦点不再锁定时,将调用使用 Builder#setOnAudioFocusChangeListener(OnAudioFocusChangeListener)
或 设置 Builder#setOnAudioFocusChangeListener(OnAudioFocusChangeListener, Handler)
的焦点侦听器,以通知它现在拥有音频焦点的应用程序。
<h4>暂停与躲避</h4>
当应用程序使用 AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
请求音频焦点时,系统将回避当前焦点所有者。 <p class=“note”>注意:此行为是 <>Android O</b> 的新增行为,而面向 SDK 级别高达 API 25 的应用程序在收到焦点丢失AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK
时必须自行实现躲避。
但躲避并不总是用户预期的行为。 一个典型示例是,当用户正在收听有声读物或播客时,设备播放驾驶路线,并且预期音频播放暂停,而不是躲避,因为很难同时理解导航提示和口述内容。 因此,当系统检测到会回避语音内容时,系统不会自动躲避:当玩家的 限定AudioAttributes#CONTENT_TYPE_SPEECH
时AudioAttributes
,将检测到此类内容。 AudioAttributes.Builder#setContentType(int)
例如,MediaPlayer#setAudioAttributes(AudioAttributes)
如果你正在为有声读物、播客编写媒体播放应用程序,请参阅 ...由于系统不会自动躲避播放语音的应用程序,因此它会调用其焦点侦听器来通知他们AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK
,以便他们可以暂停。 请注意,此行为与 的使用 AudioFocusRequest
无关,但与 的使用 AudioAttributes
有关。
如果应用程序需要暂停而不是由于播放语音以外的任何其他原因而躲避,则还可以使用 Builder#setWillPauseWhenDucked(boolean)
进行声明,这将导致系统调用焦点侦听器而不是自动躲避。
<h4>示例</h4>
下面的示例介绍了可在播放音频和使用音频焦点的任何应用程序中找到的以下步骤。 在这里,我们播放一本有声读物,应用程序旨在暂停,而不是在失去焦点时躲避。 这些步骤包括: <ul><li>创建 AudioAttributes
用于播放和焦点请求。</li><li>配置和创建 AudioFocusRequest
定义预期焦点行为的 实例。</li><li>请求音频焦点并检查返回代码,以查看播放是否可以立即发生或延迟。</li><li>实现焦点更改侦听器,以响应焦点的得失。</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.
的 android.media.AudioFocusRequest
Java 文档。
此页面的某些部分是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的条款使用。
属性
AudioAttributes |
返回 |
Class |
返回此 |
FocusGain |
返回为此 |
Handle |
基础 Android 实例的句柄。 (继承自 Object) |
JniIdentityHashCode |
一个类,用于封装有关音频焦点请求的信息。 (继承自 Object) |
JniPeerMembers |
一个类,用于封装有关音频焦点请求的信息。 |
PeerReference |
一个类,用于封装有关音频焦点请求的信息。 (继承自 Object) |
ThresholdClass |
此 API 支持 Mono for Android 基础结构,不应直接从代码中使用。 (继承自 Object) |
ThresholdType |
此 API 支持 Mono for Android 基础结构,不应直接从代码中使用。 (继承自 Object) |
方法
AcceptsDelayedFocusGain() |
返回将使用它 |
Clone() |
创建并返回此对象的副本。 (继承自 Object) |
Dispose() |
一个类,用于封装有关音频焦点请求的信息。 (继承自 Object) |
Dispose(Boolean) |
一个类,用于封装有关音频焦点请求的信息。 (继承自 Object) |
Equals(Object) |
指示某个其他对象是否“等于”此对象。 (继承自 Object) |
GetHashCode() |
返回对象的哈希代码值。 (继承自 Object) |
JavaFinalize() |
当垃圾回收确定不再引用对象时,由垃圾回收器对对象调用。 (继承自 Object) |
Notify() |
唤醒正在等待此对象的监视器的单个线程。 (继承自 Object) |
NotifyAll() |
唤醒正在等待此对象的监视器的所有线程。 (继承自 Object) |
SetHandle(IntPtr, JniHandleOwnership) |
设置 Handle 属性。 (继承自 Object) |
ToArray<T>() |
一个类,用于封装有关音频焦点请求的信息。 (继承自 Object) |
ToString() |
返回对象的字符串表示形式。 (继承自 Object) |
UnregisterFromRuntime() |
一个类,用于封装有关音频焦点请求的信息。 (继承自 Object) |
Wait() |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>。<> (继承自 Object) |
Wait(Int64) |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<> (继承自 Object) |
Wait(Int64, Int32) |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<> (继承自 Object) |
WillPauseWhenDucked() |
返回将使用此 |
显式接口实现
IJavaPeerable.Disposed() |
一个类,用于封装有关音频焦点请求的信息。 (继承自 Object) |
IJavaPeerable.DisposeUnlessReferenced() |
一个类,用于封装有关音频焦点请求的信息。 (继承自 Object) |
IJavaPeerable.Finalized() |
一个类,用于封装有关音频焦点请求的信息。 (继承自 Object) |
IJavaPeerable.JniManagedPeerState |
一个类,用于封装有关音频焦点请求的信息。 (继承自 Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
一个类,用于封装有关音频焦点请求的信息。 (继承自 Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
一个类,用于封装有关音频焦点请求的信息。 (继承自 Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) |
一个类,用于封装有关音频焦点请求的信息。 (继承自 Object) |
扩展方法
JavaCast<TResult>(IJavaObject) |
执行 Android 运行时检查的类型转换。 |
JavaCast<TResult>(IJavaObject) |
一个类,用于封装有关音频焦点请求的信息。 |
GetJniTypeName(IJavaPeerable) |
一个类,用于封装有关音频焦点请求的信息。 |