android汽车音频焦点方案,管理音频焦点 | Android 开发者 | Android Developers

两个或两个以上的 Android 应用可同时向同一输出流播放音频。系统会将所有音频流混合在一起。虽然这是一项出色的技术,但却会给用户带来很大的困扰。为了避免所有音乐应用同时播放,Android 引入了“音频焦点”的概念。

一次只能有一个应用获得音频焦点。

当您的应用需要输出音频时,它需要请求获得音频焦点,获得焦点后,就可以播放声音了。不过,在您获得音频焦点后,您可能无法将其一直持有到播放完成。其他应用可以请求焦点,从而占有您持有的音频焦点。如果发生这种情况,您的应用应暂停播放或降低音量,以便于用户听到新的音频源。

音频焦点采用合作模式。我们建议应用遵守音频焦点准则,但系统不会强制执行这些准则。如果应用想要在失去音频焦点后继续大声播放,系统无法阻止它。这是一种不好的体验,用户很可能会卸载具有这种不良行为的应用。

行为恰当的音频应用应根据以下一般准则来管理音频焦点:

在即将开始播放之前调用 requestAudioFocus(),并验证调用是否返回 onPlay() 回调中调用 requestAudioFocus()。

在其他应用获得音频焦点时,停止或暂停播放,或降低音量。

播放停止后,放弃音频焦点。

运行的 Android 版本不同,音频焦点的处理方式也会不同:

对于以 Android 5.0(API 级别 21)及更高版本为目标平台的应用,音频应用应使用

面向 Android 8.0(API 级别 26)或更高版本的应用应使用 AudioFocusRequest 包含有关应用的音频上下文和功能的信息。系统使用这些信息来自动管理音频焦点的得到和失去。

Android 8.0 及更高版本中的音频焦点

从 Android 8.0(API 级别 26)开始,当您调用 AudioFocusRequest 参数。要释放音频焦点,请调用 AudioFocusRequest 作为参数。在请求和放弃焦点时,应使用相同的 AudioFocusRequest 实例。

要创建

FocusGain 字段为必需字段;所有其他字段均为可选字段。

方法备注

每个请求中都必须包含此字段。此字段的值与 Android 8.0 之前的 requestAudioFocus() 调用中所使用的 durationHint 值相同:AUDIOFOCUS_GAIN、AUDIOFOCUS_GAIN_TRANSIENT、AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 或 AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE。

首先使用

如果未指定,则 AudioAttributes 默认为 AudioAttributes.USAGE_MEDIA。

当其他应用使用 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 请求焦点时,持有焦点的应用通常不会收到 自行降低音量。如果您需要暂停播放而不是降低音量,请调用 setWillPauseWhenDucked(true),然后创建并设置 OnAudioFocusChangeListener,具体如自动降低音量中所述。

当焦点被其他应用锁定时,对音频焦点的请求可能会失败。此方法可实现延迟获取焦点,即在焦点可用时异步获取焦点。

请注意,要使“延迟获取焦点”起作用,您还必须在音频请求中指定

只有当您在请求中还指定了 willPauseWhenDucked(true) 或 setAcceptsDelayedFocusGain(true) 时,才需要 OnAudioFocusChangeListener。

有两个方法可以设置监听器:一个带处理程序参数,一个不带。处理程序是运行监听器的线程。如果您未指定处理程序,则会使用与主

以下示例展示了如何使用 AudioFocusRequest.Builder 构建 AudioFocusRequest 来请求和放弃音频焦点:

Kotlin

audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager

focusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN).run {

setAudioAttributes(AudioAttributes.Builder().run {

setUsage(AudioAttributes.USAGE_GAME)

setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)

build()

})

setAcceptsDelayedFocusGain(true)

setOnAudioFocusChangeListener(afChangeListener, ha

你可能感兴趣的:(android汽车音频焦点方案)