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

【Android Developers Training】 45. 控制音頻

系統(tǒng) 2406 0

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

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


有很多應(yīng)用會(huì)要播放音頻,所以他們之間如何交互是很重要的。為了防止每個(gè)音樂播放器應(yīng)用在同一時(shí)間播放,Android使用音頻焦點(diǎn)來調(diào)整音頻的播放。也就是說,只有獲得了音頻焦點(diǎn)的應(yīng)用可以播放音頻。

在你的應(yīng)用開始播放音頻之前,它應(yīng)該需求并接收音頻焦點(diǎn)。另外,它應(yīng)該知道如何監(jiān)聽音頻焦點(diǎn)丟失的情況,并在發(fā)生焦點(diǎn)丟失時(shí)能夠正確地響應(yīng)。


一). 需求音頻焦點(diǎn)

在你的應(yīng)用開始播放音頻之前,它應(yīng)該獲取要使用音頻流的焦點(diǎn)。這需要調(diào)用 requestAudioFocus() 方法。如果請(qǐng)求成功,那么會(huì)返回 AUDIOFOCUS_REQUEST_GRANTED

你必須指定你正在使用的是什么流,和你期望獲得暫時(shí)的還是永久的音頻焦點(diǎn)。當(dāng)你只需要短時(shí)間的播放音頻時(shí)(比如當(dāng)播放一些使用導(dǎo)航時(shí)),那么應(yīng)該請(qǐng)求暫時(shí)焦點(diǎn)。當(dāng)你計(jì)劃在可預(yù)測(cè)的未來持續(xù)播放音頻時(shí)(比如播放音樂),那么你應(yīng)該請(qǐng)求永久焦點(diǎn)。

下面的代碼請(qǐng)求音樂音頻流的永久焦點(diǎn)。你必須在你開始播放之前就請(qǐng)求音頻焦點(diǎn),比如當(dāng)用戶按下了播放鍵,或下一級(jí)別游戲的背景音樂開始時(shí):

      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.
      
      

}
    

一旦你完成了播放,務(wù)必記得要調(diào)用 abandonAudioFocus() ,這將會(huì)告知系統(tǒng)你不再需要焦點(diǎn)并且注銷相關(guān)聯(lián)的 AudioManager.OnAudioFocusChangeListener 。對(duì)于放棄了暫時(shí)焦點(diǎn)的情況,這回允許任何被打斷的應(yīng)用繼續(xù)播放。

      
        //
      
      
         Abandon audio focus when playback complete    
      
      

am.abandonAudioFocus(afChangeListener);
    

當(dāng)請(qǐng)求暫時(shí)音頻焦點(diǎn)時(shí),你可以有一個(gè)額外的選項(xiàng):你是否希望啟用“ ducking ”。一般的,當(dāng)一個(gè)正常的應(yīng)用丟失了音頻焦點(diǎn)后,它會(huì)立馬停止播放。通過請(qǐng)求允許“ ducking ”的暫時(shí)音頻焦點(diǎn),相當(dāng)于你告知了其他應(yīng)用:你們可以繼續(xù)播放,但是他們需要在焦點(diǎn)回到他們手中之前降低音量。

      
        //
      
      
         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 "對(duì)于那些間歇性使用音頻流的應(yīng)用特別有用,比如那些語音駕駛提醒的。

在任何時(shí)候,若其他的應(yīng)用像上面描述的那樣請(qǐng)求音頻焦點(diǎn),它所選擇的永久的活暫時(shí)的(有或沒有“ ducking ”選項(xiàng))音頻焦點(diǎn),在請(qǐng)求時(shí)都會(huì)被你注冊(cè)的監(jiān)聽器所接收。


二). 處理焦點(diǎn)丟失

如果你的應(yīng)用請(qǐng)求了音頻焦點(diǎn),它遵守這樣的規(guī)定:如果其他應(yīng)用請(qǐng)求焦點(diǎn),它會(huì)按照次序丟失焦點(diǎn)。你的應(yīng)用應(yīng)該如何響應(yīng)焦點(diǎn)丟失取決于丟失的方式。

在你請(qǐng)求音頻焦點(diǎn)時(shí),注冊(cè)的音頻焦點(diǎn)變更監(jiān)聽器中 onAudioFocusChange() 回調(diào)函數(shù)會(huì)接收一個(gè)參數(shù),它描述焦點(diǎn)變化的事件。特別地,可能的焦點(diǎn)丟失事件反映的是上一部分的焦點(diǎn)請(qǐng)求類型,永久丟失,暫時(shí)丟失以及允許“ ducking ”的暫時(shí)焦點(diǎn)。

一般而言,一個(gè)暫時(shí)的音頻焦點(diǎn)丟失會(huì)導(dǎo)致你的應(yīng)用音頻流沒有聲音,但其它方面會(huì)保持不變。你應(yīng)該持續(xù)檢查音頻焦點(diǎn)的變化,并準(zhǔn)備在你重新獲得焦點(diǎn)時(shí),從暫停額位置繼續(xù)播放。

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

在下面的代碼中,我們停止播放器或者我們的媒體播放對(duì)象,如果音頻焦點(diǎn)丟失是暫時(shí)的,另外恢復(fù)它當(dāng)我們要恢復(fù)焦點(diǎn)時(shí)。如果焦點(diǎn)丟失是永久的,那么代碼會(huì)注銷我們的媒體按鍵時(shí)間接收器,并停止檢查音頻焦點(diǎn)變更。

      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
      
      
                }

    }

};
      
    

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


三). Duck!

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

下面的代碼在暫時(shí)丟失焦點(diǎn)時(shí)降低我們播放器的音量,并在恢復(fù)焦點(diǎn)后,恢復(fù)音量。

      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
      
      
                }

    }

};
      
    

音頻焦點(diǎn)的丟失是要響應(yīng)廣播中最重要的,但它不是唯一一個(gè)最重要的。系統(tǒng)會(huì)發(fā)送一系列的intent來讓你改變用戶的音頻體驗(yàn)。下一節(jié)課將會(huì)講授如何監(jiān)聽它們來提供用戶的音頻體驗(yàn)。

【Android Developers Training】 45. 控制音頻焦點(diǎn)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 91福利合集 | 欧美激情中文字幕一区二区 | 日韩欧美精品一区二区三区 | 国产精品视频偷伦精品视频 | 成人亚州| 日本b站一卡二不卡 | 久久久精品久久久久久久久久久 | 久久综合九色综合97欧美 | 久9热精品视频在线观看 | 五月激情婷婷综合 | 免费两性的视频网站 | 亚洲一区二区三区高清网 | 天天干天天曰天天操 | 久久狠色噜噜狠狠狠狠97 | 四虎海外影库www4hu | 国产经典自拍 | 国产精品成人免费视频99 | 国产亚洲漂亮白嫩美女在线 | 日本有色视频 | 一级aa免费视频毛片 | 日日干天天草 | 人人爱人人性 | 91久久精品午夜一区二区 | 香香影院在线观看 | 色播综合| 国产成人综合视频 | 99热国产这里只有精品9九 | 久久艹综合| 亚洲精品视频在线播放 | 国产亚洲综合色就色 | 国产一极毛片 | 日本精品久久久久中文字幕8 | 爱爱视频免费网址 | 91免费视频国产 | 离线枕边人在线观看 | 免费看一级黄色录像 | 亚洲手机中文字幕 | 国产精品嫩草研究所永久网址 | 老色鬼a∨在线视频在线观看 | 久久91精品久久91综合 | 婷婷狠狠 |