网站后台不能修改,桂林网萌科技有限公司,东莞南城网站设计,制作公司宣传片哪家好介绍
Android 中的音频焦点#xff08;Audio Focus#xff09;是一种机制#xff0c;用于管理应用程序之间的音频资源竞争。当多个应用程序同时请求使用音频设备时#xff0c;通过音频焦点机制可以确保最终用户的体验不受影响。
两个或两个以上的 Android 应用可同时向同…介绍
Android 中的音频焦点Audio Focus是一种机制用于管理应用程序之间的音频资源竞争。当多个应用程序同时请求使用音频设备时通过音频焦点机制可以确保最终用户的体验不受影响。
两个或两个以上的 Android 应用可同时向同一输出流播放音频。系统会将所有音频流混合在一起。虽然这是一项出色的技术但却会给用户带来很大的困扰。为了避免所有音乐应用同时播放Android 引入了“音频焦点”的概念。 一次只能有一个应用获得音频焦点。
当您的应用需要输出音频时它需要请求获得音频焦点获得焦点后就可以播放声音了。不过在您获得音频焦点后您可能无法将其一直持有到播放完成。其他应用可以请求焦点从而占有您持有的音频焦点。如果发生这种情况您的应用应暂停播放或降低音量以便于用户听到新的音频源。
音频焦点采用合作模式。我们建议应用遵守音频焦点准则但系统不会强制执行这些准则。如果应用想要在失去音频焦点后继续大声播放系统无法阻止它。这是一种不好的体验用户很可能会卸载具有这种不良行为的应用。 焦点事件 AUDIOFOCUS_GAIN 说明 应用获得了音频焦点可以继续播放音频。 处理方式 在这个状态下应用可以正常播放音频。在失去焦点后再次获取焦点时通常需要在这个状态下恢复播放。 AUDIOFOCUS_LOSS 说明 【永久性失去焦点】应用失去了音频焦点需要停止音频播放。 处理方式 当收到 AUDIOFOCUS_LOSS 时应用应该停止播放音频并释放相关资源。这种情况通常是由于其他应用请求了长时间的音频焦点例如开始播放长时间的音频文件。不要立即尝试重新获取焦点。 AUDIOFOCUS_LOSS_TRANSIENT 说明 【暂时性失去焦点】应用短暂失去了音频焦点但可以在稍后重新获取焦点。 处理方式 当收到 AUDIOFOCUS_LOSS_TRANSIENT 时应用应该暂停音频播放。这种情况通常是由于短暂的通知声、铃声等情况导致的。应用通常会在稍后重新获取焦点并恢复播放。 AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK 说明 【暂时性失去焦点】应用短暂失去了音频焦点但可以降低音量继续播放。稍后可以重新获取焦点。 处理方式 当收到 AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK 时应用可以选择降低音量而不是完全停止音频播放。这种情况通常用于在接收短暂通知时应用可以继续以较低的音量播放。
暂时性失去焦点
在暂时性失去音频焦点时您应该继续监控音频焦点的变化并准备好在重新获得焦点后恢复正常播放。当抢占焦点的应用放弃焦点时您会收到一个回调 (AUDIOFOCUS_GAIN)。此时您可以在此回调中将音量恢复到正常水平或重新开始播放。
永久性失去焦点
如果是永久性失去音频焦点 (AUDIOFOCUS_LOSS)则其他应用会播放音频。您的应用应立即暂停播放因为它不会收到 AUDIOFOCUS_GAIN 回调。要想重新开始播放用户必须执行明确的操作例如在通知或应用界面中按播放传输控件。 代码示例
Android 8.0 及更高版本中的音频焦点
从 Android 8.0API 级别 26开始当您调用 requestAudioFocus() 时必须提供 AudioFocusRequest 参数。要释放音频焦点请调用 abandonAudioFocusRequest() 方法该方法也接受 AudioFocusRequest 作为参数。在请求和放弃焦点时应使用相同的 AudioFocusRequest 实例。
要创建 AudioFocusRequest请使用 AudioFocusRequest.Builder。由于焦点请求始终必须指定请求的类型因此此类型会包含在构建器的构造函数中。使用构建器的方法来设置请求的其他字段。 audioManager getSystemService(Context.AUDIO_SERVICE) as AudioManagerfocusRequest AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN).run {setAudioAttributes(AudioAttributes.Builder().run {setUsage(AudioAttributes.USAGE_MEDIA)//or AudioAttributes.USAGE_GAMEsetContentType(AudioAttributes.CONTENT_TYPE_MUSIC)build()})setAcceptsDelayedFocusGain(true)setOnAudioFocusChangeListener(afChangeListener, handler)build()}val focusLock Any()var playbackDelayed falsevar playbackNowAuthorized false// ...val res audioManager.requestAudioFocus(focusRequest)synchronized(focusLock) {playbackNowAuthorized when (res) {AudioManager.AUDIOFOCUS_REQUEST_FAILED - falseAudioManager.AUDIOFOCUS_REQUEST_GRANTED - {playbackNow()true}AudioManager.AUDIOFOCUS_REQUEST_DELAYED - {playbackDelayed truefalse}else - false}}val afChangeListener AudioManager.OnAudioFocusChangeListener { focusChange -when (focusChange) {AudioManager.AUDIOFOCUS_LOSS - {// Permanent loss of audio focus. Pause playback immediatelysynchronized(focusLock) {resumeOnFocusGain falseplaybackDelayed false}pausePlayback()}AudioManager.AUDIOFOCUS_LOSS_TRANSIENT - {// Pause playbacksynchronized(focusLock) {resumeOnFocusGain trueplaybackDelayed false}pausePlayback()}AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK - {// ... pausing or Lower the volume depends on your app}AudioManager.AUDIOFOCUS_GAIN - {// Your app has been granted audio focus again// Raise volume to normal, restart playback if necessaryif (playbackDelayed || resumeOnFocusGain) {synchronized(focusLock) {playbackDelayed falseresumeOnFocusGain false}playbackNow()}}}}官方文档链接管理音频焦点