亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

【Android Developers Training】 45. 控制音頻

系統 1989 0

注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術一般,由于喜愛安卓而產生了翻譯的念頭,純屬個人興趣愛好。

原文鏈接: http://developer.android.com/training/managing-audio/audio-focus.html


有很多應用會要播放音頻,所以他們之間如何交互是很重要的。為了防止每個音樂播放器應用在同一時間播放,Android使用音頻焦點來調整音頻的播放。也就是說,只有獲得了音頻焦點的應用可以播放音頻。

在你的應用開始播放音頻之前,它應該需求并接收音頻焦點。另外,它應該知道如何監聽音頻焦點丟失的情況,并在發生焦點丟失時能夠正確地響應。


一). 需求音頻焦點

在你的應用開始播放音頻之前,它應該獲取要使用音頻流的焦點。這需要調用 requestAudioFocus() 方法。如果請求成功,那么會返回 AUDIOFOCUS_REQUEST_GRANTED 。

你必須指定你正在使用的是什么流,和你期望獲得暫時的還是永久的音頻焦點。當你只需要短時間的播放音頻時(比如當播放一些使用導航時),那么應該請求暫時焦點。當你計劃在可預測的未來持續播放音頻時(比如播放音樂),那么你應該請求永久焦點。

下面的代碼請求音樂音頻流的永久焦點。你必須在你開始播放之前就請求音頻焦點,比如當用戶按下了播放鍵,或下一級別游戲的背景音樂開始時:

      AudioManager am =
      
         mContext.getSystemService(Context.AUDIO_SERVICE);

...




      
      
        //
      
      
         Request audio focus for playback
      
      
        int
      
       result =
      
         am.requestAudioFocus(afChangeListener,

                                 
      
      
        //
      
      
         Use the music stream.
      
      
                                         AudioManager.STREAM_MUSIC,

                                 
      
      
        //
      
      
         Request permanent focus.
      
      
                                         AudioManager.AUDIOFOCUS_GAIN);

   


      
      
        if
      
       (result ==
      
         AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {

    am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);

    
      
      
        //
      
      
         Start playback.
      
      

}
    

一旦你完成了播放,務必記得要調用 abandonAudioFocus() ,這將會告知系統你不再需要焦點并且注銷相關聯的 AudioManager.OnAudioFocusChangeListener 。對于放棄了暫時焦點的情況,這回允許任何被打斷的應用繼續播放。

      
        //
      
      
         Abandon audio focus when playback complete    
      
      

am.abandonAudioFocus(afChangeListener);
    

當請求暫時音頻焦點時,你可以有一個額外的選項:你是否希望啟用“ ducking ”。一般的,當一個正常的應用丟失了音頻焦點后,它會立馬停止播放。通過請求允許“ ducking ”的暫時音頻焦點,相當于你告知了其他應用:你們可以繼續播放,但是他們需要在焦點回到他們手中之前降低音量。

      
        //
      
      
         Request audio focus for playback
      
      
        int
      
       result =
      
         am.requestAudioFocus(afChangeListener,

                             
      
      
        //
      
      
         Use the music stream.
      
      
                                     AudioManager.STREAM_MUSIC,

                             
      
      
        //
      
      
         Request permanent focus.
      
      
                                     AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);

   


      
      
        if
      
       (result ==
      
         AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {

    
      
      
        //
      
      
         Start playback.
      
      

}
    

" Ducking "對于那些間歇性使用音頻流的應用特別有用,比如那些語音駕駛提醒的。

在任何時候,若其他的應用像上面描述的那樣請求音頻焦點,它所選擇的永久的活暫時的(有或沒有“ ducking ”選項)音頻焦點,在請求時都會被你注冊的監聽器所接收。


二). 處理焦點丟失

如果你的應用請求了音頻焦點,它遵守這樣的規定:如果其他應用請求焦點,它會按照次序丟失焦點。你的應用應該如何響應焦點丟失取決于丟失的方式。

在你請求音頻焦點時,注冊的音頻焦點變更監聽器中 onAudioFocusChange() 回調函數會接收一個參數,它描述焦點變化的事件。特別地,可能的焦點丟失事件反映的是上一部分的焦點請求類型,永久丟失,暫時丟失以及允許“ ducking ”的暫時焦點。

一般而言,一個暫時的音頻焦點丟失會導致你的應用音頻流沒有聲音,但其它方面會保持不變。你應該持續檢查音頻焦點的變化,并準備在你重新獲得焦點時,從暫停額位置繼續播放。

如果音頻焦點要永久丟失,它假定另一個應用正在被用來聽音頻,并且你的應用應該將自己終止。在實際的場景下,這意味著停止播放,移除媒體按鍵監聽,允許新的音頻播放器單獨處理這些事件,并放棄你的音頻焦點。這樣之后,在你恢復播放音頻之前你只能期望用戶的行為(如在你應用中按下播放鍵)。

在下面的代碼中,我們停止播放器或者我們的媒體播放對象,如果音頻焦點丟失是暫時的,另外恢復它當我們要恢復焦點時。如果焦點丟失是永久的,那么代碼會注銷我們的媒體按鍵時間接收器,并停止檢查音頻焦點變更。

      OnAudioFocusChangeListener afChangeListener = 
      
        new
      
      
         OnAudioFocusChangeListener() {

    
      
      
        public
      
      
        void
      
       onAudioFocusChange(
      
        int
      
      
         focusChange) {

        
      
      
        if
      
       (focusChange ==
      
         AUDIOFOCUS_LOSS_TRANSIENT

            
      
      
        //
      
      
         Pause playback
      
      

        } 
      
        else
      
      
        if
      
       (focusChange ==
      
         AudioManager.AUDIOFOCUS_GAIN) {

            
      
      
        //
      
      
         Resume playback 
      
      

        } 
      
        else
      
      
        if
      
       (focusChange ==
      
         AudioManager.AUDIOFOCUS_LOSS) {

            am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);

            am.abandonAudioFocus(afChangeListener);

            
      
      
        //
      
      
         Stop playback
      
      
                }

    }

};
      
    

對于允許 ducking 而丟失焦點的情況,那么你可以使用“ ducking ”而不是停止播放。


三). Duck!

Ducking 是降低你音頻外放的音量使得另一個應用的暫時性音頻更容易聽見,這樣就不用暫停你自己應用的播放了。

下面的代碼在暫時丟失焦點時降低我們播放器的音量,并在恢復焦點后,恢復音量。

      OnAudioFocusChangeListener afChangeListener = 
      
        new
      
      
         OnAudioFocusChangeListener() {

    
      
      
        public
      
      
        void
      
       onAudioFocusChange(
      
        int
      
      
         focusChange) {

        
      
      
        if
      
       (focusChange ==
      
         AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {

            
      
      
        //
      
      
         Lower the volume
      
      

        } 
      
        else
      
      
        if
      
       (focusChange ==
      
         AudioManager.AUDIOFOCUS_GAIN) {

            
      
      
        //
      
      
         Raise it back to normal
      
      
                }

    }

};
      
    

音頻焦點的丟失是要響應廣播中最重要的,但它不是唯一一個最重要的。系統會發送一系列的intent來讓你改變用戶的音頻體驗。下一節課將會講授如何監聽它們來提供用戶的音頻體驗。

【Android Developers Training】 45. 控制音頻焦點


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本天天谢天天要天天爱 | 天天做天天爱天天爽 | 欧美一区二区三区网站 | 免费国产成人综合 | 亚洲天堂国产精品 | 国产福利在线观看 | 欧美社区 | 国产在线精品一区二区不卡 | 欧美综合色 | 日本视频不卡 | 337p色噜噜人体大胆欧美 | ijzzijzz精的女人美女 | 欧日韩在线不卡视频 | 久久国产精品最新一区 | 天天舔天天操天天干 | 欧洲亚洲综合一区二区三区 | 成人网影 | 亚洲综合激情六月婷婷在线观看 | 国产精品99一区二区三区 | 欧美激情精品久久久久久久久久 | 国产成人久久精品麻豆二区 | 一级一毛片a级毛片 | 久久久久久久91精品免费观看 | 激情九月天 | 日韩另类视频 | 亚洲综合在线播放 | 国产不卡在线 | 精彩视频一区二区三区 | aaa一级特黄 | 狠狠色综合久久婷婷色天使 | 三级a做爰大乳在线观看 | 久久免费国产视频 | 成人欧美视频在线观看播放 | 日韩精品午夜视频一区二区三区 | 六月色婷婷| 亚洲成人网在线观看 | 亚洲人成网i8禁止 | 亚洲精品69 | h在线观看免费 | 亚洲国产精品日韩高清秒播 | 欧美成人高清 |