安卓-音频焦点

安卓-音频焦点

音频焦点

是什么

一个安卓系统肯定会有多个音源,音频焦点是用来处理这些音源的冲突

eg 在播放网易云的时候 打开抖音 网易云会自动暂停 并且网易云有提醒 其实是网易云做了处理

发者需要明确编写代码来请求和处理音频焦点的变化。

怎么做

主要涉及这2个对象

private var audioFocusRequest: AudioFocusRequest? = null
private var audioManager: AudioManager? = null

主要的要做的工作有3个

1.当应用开始播放音频时,开发者需要通过 AudioManager 请求音频焦点:

  if (audioFocus) { //audioFocus是自定义bool
            doPlaying()
        }else {
            val result = audioManager!!.requestAudioFocus(audioFocusRequest!!)
            if (result == AudioManager.AUDIOFOCUS_GAIN) {
                doPlaying()
                audioFocus = true
            }
        }

2.处理音频焦点变化:

就是实现OnAudioFocusChangeListener 并且set进去

        val audioFocusChangeListener = AudioManager.OnAudioFocusChangeListener { focusChange: Int ->
             when (focusChange) {
                 AudioManager.AUDIOFOCUS_GAIN -> {
                     audioFocus = true
                     play()
                     Log.d(TAG, "AUDIO_FOCUS_GAIN")
                 }
                 AudioManager.AUDIOFOCUS_LOSS -> {
                     audioFocus = false
                     pause()
                     Log.d(TAG, "AUDIO_FOCUS_LOSS")
                 }
                 AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> {
                     audioFocus = false
                     pause()
                     Log.d(TAG, "AUDIO_FOCUS_LOSS_TRANSIENT")
                 }
                 AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK ->
                     Log.d(TAG, "AUDIO_FOCUS_LOSS_TRANSIENT_CAN_DUCK")
             }
         }
  audioFocusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
             .setAudioAttributes(AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).build())
             .setOnAudioFocusChangeListener(audioFocusChangeListener)
             .build()

3.放弃音频焦点: 当你的应用不再需要播放音频时

音乐暂停 或者应用销毁等等

            audioManager!!.abandonAudioFocusRequest(audioFocusRequest!!)
Android 系统中,音频焦点(Audio Focus)机制用于管理多个应用音频资源的访问,尤其是在多个应用可能同时尝试播放或录制音频的情况下。这种机制确保了音频播放的合理性和用户体验的一致性,例如当一个应用正在播放音乐时,另一个应用试图播放提示音,系统可以通过音频焦点机制来协调两者的优先级。 ### 音频焦点的基本概念 Android 中的音频焦点主要通过 `AudioManager` 类来管理。应用在播放音频之前需要请求音频焦点,播放结束后释放焦点。系统根据当前焦点状态决定是否允许某个应用播放音频音频焦点的状态包括: - `AUDIOFOCUS_GAIN`:获得音频焦点- `AUDIOFOCUS_LOSS`:失去音频焦点,通常意味着另一个应用获得了焦点- `AUDIOFOCUS_LOSS_TRANSIENT`:短暂失去音频焦点,例如来电时。 - `AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK`:短暂失去焦点,但可以降低音量继续播放。 ### 请求和释放音频焦点 应用可以通过 `AudioManager` 的 `requestAudioFocus()` 方法请求音频焦点,并通过 `abandonAudioFocus()` 方法释放焦点。 ```java AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); // 请求音频焦点 int result = audioManager.requestAudioFocus( new AudioManager.OnAudioFocusChangeListener() { @Override public void onAudioFocusChange(int focusChange) { // 处理焦点变化 switch (focusChange) { case AudioManager.AUDIOFOCUS_GAIN: // 重新播放音频 break; case AudioManager.AUDIOFOCUS_LOSS: // 停止播放并释放资源 break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: // 暂停播放或降低音量 break; } } }, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN ); if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { // 开始播放音频 } // 释放音频焦点 audioManager.abandonAudioFocus(null); ``` ### 音频焦点与媒体播放器的集成 当使用 `MediaPlayer` 播放音频时,建议在播放前请求音频焦点,并在播放结束或暂停时释放焦点。这样可以确保其他应用在需要时能够获得音频资源。 ```java MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound); mediaPlayer.setOnCompletionListener(mp -> { // 释放音频焦点 audioManager.abandonAudioFocus(null); }); ``` ### 音频焦点的优先级管理 系统会根据应用的类型和用户的交互行为来决定音频焦点的优先级。例如,导航应用的语音提示通常具有较高的优先级,可以在其他音频播放时短暂中断它们。开发者可以通过设置音频流类型(如 `STREAM_MUSIC` 或 `STREAM_VOICE_CALL`)来影响焦点的分配。 ### 音频焦点的最佳实践 1. **及时请求和释放焦点**:在开始播放音频前请求焦点,播放结束后立即释放,以避免不必要的资源占用。 2. **处理焦点变化**:实现 `OnAudioFocusChangeListener` 接口,监听焦点变化并做出相应调整,例如暂停播放或降低音量。 3. **支持 Ducking 模式**:在收到 `AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK` 事件时,可以选择降低音量而不是完全停止播放,以提供更平滑的用户体验。 4. **合理选择音频流类型**:根据应用的功能选择合适的音频流类型,以确保焦点请求的成功率。 ### 音频焦点与车载系统(AAOS)的关系 在 Android Automotive OS(AAOS)环境中,音频焦点机制同样适用。由于 AAOS 保留了 Android 原有的核心架构,因此音频焦点的管理和使用方式与手机端基本一致。然而,在车载环境中,音频焦点的管理可能更加复杂,因为涉及到更多类型的音频输入输出设备(如车载音响、麦克风等),并且需要考虑驾驶安全和用户交互的特殊需求。例如,导航提示音可能需要更高的优先级,以确保驾驶员能够及时获取重要信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值