现在的位置: 首页 > 综合 > 正文

【Android Training – Multimedia】管理音频播放[Lesson 2 - 管理音频焦点Audio Focus]

2018年04月30日 ⁄ 综合 ⁄ 共 3647字 ⁄ 字号 评论关闭
Managing
Audio Focus[管理音频焦点]
  • 很多App都可以播放音频,因此在播放前如何获取到音频焦点就显得很重要了,这样可以避免同时出现多个声音,Android使用audio focus来节制音频的播放,仅仅是获取到audio focus的App才能够播放音频。
  • 在App开始播放音频之前,它需要经过发出请求[request]->接受请求[receive]->音频焦点锁定[Audio Focus]的过程。同样,它需要知道如何监听失去音频焦点[lose of audio focus]的事件并进行合适的响应。

Request the Audio Focus [请求获取音频焦点]

  • 通过call requestAudioFocus() 方法来获取你想要获取到的音频流焦点。如果请求成功这个方法会返回 AUDIOFOCUS_REQUEST_GRANTED 
  • 我们必须指定正在使用哪个音频流,而且是否想请求短暂还是永久的audio focus。
  • 短暂的焦点锁定:当期待播放一个短暂的音频的时候(比如播放导航指示)
  • 永久的焦点锁定:当计划播放可预期到的较长的音频的时候(比如播放音乐)
  • 下面是一个在播放音乐的时候请求永久的音频焦点的例子,我们必须在开始播放之前立即请求音频焦点,比如在用户点击播放或者游戏程序中下一关开始的片头音乐。

  1. AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);  
  2. ...  
  3.   
  4. // Request audio focus for playback  
  5. int result = am.requestAudioFocus(afChangeListener,  
  6.                                  // Use the music stream.  
  7.                                  AudioManager.STREAM_MUSIC,  
  8.                                  // Request permanent focus.  
  9.                                  AudioManager.AUDIOFOCUS_GAIN);  
  10.      
  11. if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {  
  12.     am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);  
  13.     // Start playback.  
  14. }  
  1. // Abandon audio focus when playback complete      
  2. am.abandonAudioFocus(afChangeListener);  

  • 当请求短暂音频焦点的时候,我们可以选择是否开启“ducking”。
  • Ducking是一个特殊的机制使得允许音频间歇性的短暂播放。
  • 通常情况下,一个好的App在失去音频焦点的时候它会立即保持安静。如果我们选择在请求短暂音频焦点的时候开启了ducking,那意味着其它App可以继续播放,仅仅是在这一刻降低自己的音量,在短暂重新获取到音频焦点后恢复正常音量[也就是说:不用理会这个请求短暂焦点的请求,这并不会导致目前在播放的音频受到牵制,比如在播放音乐的时候突然出现一个短暂的短信提示声音,这个时候仅仅是把播放歌曲的音量暂时调低,好让短信声能够让用户听到,之后立马恢复正常播放]。
  1. // Request audio focus for playback  
  2. int result = am.requestAudioFocus(afChangeListener,  
  3.                              // Use the music stream.  
  4.                              AudioManager.STREAM_MUSIC,  
  5.                              // Request permanent focus.  
  6.                              AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);  
  7.      
  8. if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {  
  9.     // Start playback.  
  10. }  

Handle the Loss of Audio Focus[处理失去音频焦点]

  • 如果A程序可以请求获取音频焦点,那么在B程序请求获取的时候,A获取到的焦点就会失去。显然我们需要处理失去焦点的事件。
  • 在音频焦点的监听器里面,当接受到描述焦点改变的事件时会触发 onAudioFocusChange()回调方法。对应于获取焦点的三种类型,我们同样会有三种失去焦点的类型。
    • 失去短暂焦点:通常在失去这种焦点的情况下,我们会暂停当前音频的播放或者降低音量,同时需要准备恢复播放在重新获取到焦点之后。
    • 失去永久焦点:假设另外一个程序开始播放音乐等,那么我们的程序就应该有效的结束自己。实用的做法是停止播放,移除button监听,允许新的音频播放器独占监听那些按钮事件,并且放弃自己的音频焦点
    • 在重新播放器自己的音频之前,我们需要确保用户重新点击自己App的播放按钮等。
  1. OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {  
  2.     public void onAudioFocusChange(int focusChange) {  
  3.         if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT  
  4.             // Pause playback  
  5.         } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {  
  6.             // Resume playback   
  7.         } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {  
  8.             am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);  
  9.             am.abandonAudioFocus(afChangeListener);  
  10.             // Stop playback  
  11.         }  
  12.     }  
  13. };  

在上面失去短暂焦点的例子中,如果允许ducking,那么我们可以选择“duck”的行为而不是暂停当前的播放。

Duck! [闪避]

Ducking是一个特殊的机制使得允许音频间歇性的短暂播放。在Ducking的情况下,正常播放的歌曲会降低音量来凸显这个短暂的音频声音,这样既让这个短暂的声音比较突出,又不至于打断正常的声音。

请看例子:

  1. OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {  
  2.     public void onAudioFocusChange(int focusChange) {  
  3.         if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK  
  4.             // Lower the volume  
  5.         } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {  
  6.             // Raise it back to normal  
  7.         }  
  8.     }  
  9. };  

监听失去音频焦点是最重要的广播之一,但不是唯一的方法。系统广播了一系列的intent来警示你去改变用户的音频使用体验。下节课会演示如何监视那些广播来提升用户的整体体验。

抱歉!评论已关闭.