偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Android音樂(lè)編程:管理音頻焦點(diǎn)

移動(dòng)開發(fā) Android
因?yàn)橄到y(tǒng)中可能會(huì)有多個(gè)應(yīng)用程序會(huì)播放音頻,所以需要考慮他們之間該如何交互,為了避免多個(gè)應(yīng)用程序同時(shí)播放音樂(lè),Android 系統(tǒng)使用音頻焦點(diǎn)來(lái)進(jìn)行統(tǒng)一管理,即只有獲得了音頻焦點(diǎn)的應(yīng)用程序才可以播放音樂(lè)。

您的應(yīng)用程序在開始播放音頻文件前,首先應(yīng)該請(qǐng)求獲得音頻焦點(diǎn),并且應(yīng)該同時(shí)注冊(cè)監(jiān)聽(tīng)音頻焦點(diǎn)的丟失通知,即如果音頻焦點(diǎn)被系統(tǒng)或其他的應(yīng)用程序搶占時(shí),您的應(yīng)用程序可以做出合適的響應(yīng)。

獲取音頻焦點(diǎn)

您的應(yīng)用程序在開始播放任何音頻之前,首先應(yīng)該持有流的音頻焦點(diǎn)。

可以通過(guò)調(diào)用 requestAudioFocus()  來(lái)實(shí)現(xiàn),如果請(qǐng)求成功,返回 AUDIOFOCUS_REQUEST_GRANTED 。

 

您必須指定流類型(使用的是哪一個(gè)流)和音頻焦點(diǎn)的類型(短暫的或是持久的)。

瞬態(tài)焦點(diǎn)用來(lái)播放很短時(shí)間的音頻(例如,播放導(dǎo)航指令)。

 

持久焦點(diǎn)用來(lái)播放較長(zhǎng)一段時(shí)間的音頻(例如,播放音樂(lè))。

 

下面的代碼片斷演示了請(qǐng)求音樂(lè)音頻流的永久音頻焦點(diǎn)。

例如當(dāng)用戶按下播放背景音樂(lè)的按鍵,您應(yīng)該立即請(qǐng)求音頻焦點(diǎn),當(dāng)成功獲得了焦點(diǎn)后再開始播放音樂(lè)。

 

  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.     // 開始播放音樂(lè)文件 

一旦您的應(yīng)用程序完成了播放,請(qǐng)記得要調(diào)用 abandonAudioFocus()  方法來(lái)通知系統(tǒng)釋放音頻焦點(diǎn),同時(shí)注銷相關(guān)的 AudioManager.OnAudioFocusChangeListener 。這樣當(dāng)您的應(yīng)用程序釋放了音頻焦點(diǎn),則系統(tǒng)會(huì)允許其他被中斷的應(yīng)用程序重新獲取該焦點(diǎn)來(lái)繼續(xù)播放。

  1. // Abandon audio focus when playback complete 
  2. am.abandonAudioFocus(afChangeListener); 

當(dāng)請(qǐng)求瞬態(tài)音頻焦點(diǎn)時(shí)有一個(gè)附加參數(shù)可供設(shè)置,即是否允許 “DUCK”。通常當(dāng)應(yīng)用程序失去了音頻焦點(diǎn)時(shí)應(yīng)該停止播放。如果獲取短暫音頻焦點(diǎn)的時(shí)候設(shè)置了”DUCK” 附加參數(shù),則允許其他的應(yīng)用程序繼續(xù)播放,不需要停止,只要降低音量就可以了,然后直到您的應(yīng)用程序釋放了焦點(diǎn),其他應(yīng)用程序再重新獲得的時(shí)候,將音量還 原到有一開始的狀態(tài)。

  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. 

“DUCK” 特別適合那種間歇性播放音頻流的應(yīng)用程序,如駕駛導(dǎo)航的聲音提示。

每當(dāng)其他的應(yīng)用程序請(qǐng)求獲得音頻焦點(diǎn)(永久性的,短暫的,短暫并且支持DUCK的)的時(shí)候,您應(yīng)用程序中注冊(cè)的音頻焦點(diǎn)監(jiān)聽(tīng)器都會(huì)收到相應(yīng)的消息通知。

處理音頻焦點(diǎn)的丟失

如果您的應(yīng)用程序可以請(qǐng)求音頻焦點(diǎn),那么當(dāng)其他應(yīng)用程序申請(qǐng)的時(shí)候,您的應(yīng)用程序也可能會(huì)丟失音頻焦點(diǎn)。怎么樣應(yīng)對(duì)音頻焦點(diǎn)丟失的情況則取決于音頻焦點(diǎn)丟失的方式。

當(dāng)音頻焦點(diǎn)丟失時(shí),您注冊(cè)的監(jiān)聽(tīng)函數(shù)onAudioFocusChange()會(huì)收到一個(gè)事件通知,通知中的參數(shù)包括了具體的信息,比如是永久焦點(diǎn)丟失,短暫焦點(diǎn)丟失,還是短暫焦點(diǎn)且允許DUCK的焦點(diǎn)丟失。

通常,如果是短暫焦點(diǎn)的丟失,您的應(yīng)用程序應(yīng)該暫停當(dāng)前的播放,但其他狀態(tài)信息繼續(xù)保持,并且應(yīng)該持續(xù)監(jiān)聽(tīng)音頻焦點(diǎn)的改變,一旦重新獲得了音頻焦點(diǎn),則可以馬上恢復(fù)到以前的播放狀態(tài)。

假如是永久焦點(diǎn)的丟失,則通常意味著其他應(yīng)用程序要長(zhǎng)時(shí)間播放音頻了,您的應(yīng)用程序應(yīng)該停止播放,放棄音頻焦點(diǎn)的監(jiān)聽(tīng),并注銷所有的媒體按鈕監(jiān)聽(tīng) 器,從而讓獲得焦點(diǎn)的其他應(yīng)用程序來(lái)監(jiān)聽(tīng)媒體播放控制按鈕的按鍵消息。如果要恢復(fù)您應(yīng)用程序的播放狀態(tài),則通常需要用戶重新啟動(dòng)您的應(yīng)用程序。

在下面的代碼片段中,如果丟失的是短暫音頻焦點(diǎn),則暫定當(dāng)前應(yīng)用程序的播放,如果丟失的是永久音頻焦點(diǎn),則停止當(dāng)前應(yīng)用程序的播放,停止監(jiān)聽(tīng)音頻焦點(diǎn)的變更,并注銷媒體按鈕事件的監(jiān)聽(tīng)。

  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. }; 

如果丟失的短暫音頻焦點(diǎn)允許DUCK狀態(tài),在這種情況下,應(yīng)用程序降低音量繼續(xù)播放,不需要暫停。

Duck!

DUCK:降低您應(yīng)用程序的音量,從而不會(huì)打擾其他應(yīng)用程序音頻的播放。

在下面的代碼片段中,當(dāng)我們失去焦點(diǎn)的時(shí)候,降低了媒體播放的音量,重新獲得焦點(diǎn)的時(shí)候,將音量恢復(fù)到原來(lái)的狀態(tài)。

  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. }; 

音頻焦點(diǎn)的丟失是非常重要的一種系統(tǒng)狀態(tài)變化通知,系統(tǒng)會(huì)廣播很多有關(guān)音頻狀態(tài)變化的通知,您的應(yīng)用程序應(yīng)該監(jiān)聽(tīng)這些變化,并作出合適的應(yīng)對(duì)方案,從而提高用戶的音樂(lè)體驗(yàn)。

參考文摘:

http://developer.android.com/training/managing-audio/audio-focus.html

 

原文鏈接:

http://blog.zhourunsheng.com/2011/12/android-%E9%9F%B3%E4%B9%90%E7%BC%96%E7%A8%8B%E4%B8%93%E9%A2%98%E4%B9%8B%E7%AE%A1%E7%90%86%E9%9F%B3%E9%A2%91%E7%84%A6%E7%82%B9/

 

責(zé)任編輯:佚名 來(lái)源: 潤(rùn)物無(wú)聲的博客
相關(guān)推薦

2011-12-23 15:04:05

Android音樂(lè)編程管理音頻硬件

2013-09-29 09:49:04

編程生活方式

2016-12-12 09:58:47

AndroidAndroid Vie

2011-06-22 10:27:32

QT 鍵盤 焦點(diǎn)

2011-12-23 10:25:11

Android音樂(lè)編程控制音量

2016-04-21 09:43:33

編程音樂(lè)

2019-11-18 09:04:16

metaflac音樂(lè)標(biāo)簽開源

2017-12-28 14:51:01

AndroidView焦點(diǎn)

2023-11-28 12:04:06

AI人工智能

2023-11-21 21:39:38

單例模式音頻管理器

2017-11-07 20:12:05

Linux音頻設(shè)備ALSA

2023-08-03 07:24:40

MetaAI 語(yǔ)言模型

2012-07-03 09:18:24

惠普云計(jì)算融合云

2015-06-16 10:27:13

iOSAndroid音頻

2022-08-15 19:25:56

Android音頻PCM

2023-11-21 14:48:11

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)