[Android Training视频系列] 8.1 Controlling Your App’s Volume and Playback
主要內(nèi)容:
1 鑒別使用的是哪個(gè)音頻流
2 使用物理音量鍵控制應(yīng)用程序的音量
3 使用物理播放控制鍵來控制應(yīng)用程序的音頻播放
視頻講解:http://www.eyeandroid.com/thread-15877-1-1.html
控制應(yīng)用程序的音量和音頻的播放
?
?????? 一個(gè)好的用戶體驗(yàn)是可預(yù)期可控的。如果應(yīng)用程序是在播放音頻,那么顯然我們需要做到能夠通過硬件按鈕、軟件按鈕、藍(lán)牙耳麥等來控制音量。
?????? 同樣的,我們需要能夠監(jiān)聽Media Button發(fā)出的播放、停止、暫停、跳過、上一首等動(dòng)作,并且在應(yīng)用程序所使用的Audio Stream上進(jìn)行對(duì)應(yīng)的響應(yīng)。
?????? 鑒別使用的是哪個(gè)音頻流
?????? 首先需要知道的是我們的應(yīng)用程序會(huì)使用到哪些音頻流。
?????? Android為播放音樂、鬧鈴、通知鈴、來電聲音、系統(tǒng)聲音,打電話聲音與DTMF頻道分別維護(hù)了一個(gè)隔離的音頻流。這是我們能夠控制不同音頻的前提。
?????? 這些音頻流中大多數(shù)都是被系統(tǒng)限制的,不能胡亂使用。除了你的應(yīng)用程序是需要做替換鬧鈴操作,幾乎其他的播放音頻操作都是使用"STREAM_MUSIC"音頻流。
?????? 使用硬件音量鍵來控制應(yīng)用程序的音量
?????? 默認(rèn)情況下,按下音量控制鍵會(huì)調(diào)節(jié)當(dāng)前被激活的音頻流,如果此時(shí)你的應(yīng)用程序沒有任何聲音在播放,則會(huì)調(diào)節(jié)鈴聲的音量。
?????? 如果你的應(yīng)用程序是一個(gè)游戲或者音樂程序,需要在不管是否目前正在播放歌曲或者游戲是否發(fā)出聲音,按硬件的音量鍵都會(huì)使其音量得到調(diào)節(jié)。
?????? 我們需要監(jiān)聽音量鍵是否被按下,Android提供了setVolumeControlStream()的方法來直接控制指定的音頻流的音量。
?????? 在鑒別出應(yīng)用程序會(huì)使用哪個(gè)音頻流之后,需要在Activity或者Fragment的onCreate中就調(diào)用setVolumeControlStream,這樣能確保不管應(yīng)用程序是否可見,音頻控制功能都以用戶的預(yù)期工作。
| setVolumeControlStream(AudioManager.STREAM_MUSIC); |
?????? 使用硬件的播放控制按鍵來控制應(yīng)用程序音頻播放
?????? 媒體播放按鈕,例如播放, 暫停, 停止, 跳過, 上一首等功能同樣可以在一些線控,耳麥或者其他無線控制設(shè)備上實(shí)現(xiàn)。無論用戶按下上面任何設(shè)備上的控制按鈕,系統(tǒng)都會(huì)廣播一個(gè)帶有ACTION_MEDIA_BUTTON的Intent。
?????? 為了響應(yīng)那些操作,需要像下面一樣注冊(cè)一個(gè)BroadcastReceiver在Manifest文件中。?????
| <receiver android:name=".RemoteControlReceiver"> ??? <intent-filter> ??????? <action android:name="android.intent.action.MEDIA_BUTTON" /> ??? </intent-filter> </receiver> |
?????? Receiver需要判斷這個(gè)廣播是來自哪個(gè)按鈕的操作,Intent在EXTRA_KEY_EVENT中包含了KEY信息,同樣KeyEvent類包含了一系列KEYCODE_MEDIA_*的靜態(tài)變量來表示不同的媒體按鈕,例如KEYCODE_MEDIA_PLAY_PAUSE 和 KEYCODE_MEDIA_NEXT.
?????? 下面的代碼演示如何獲取按下的媒體按鍵以及如何對(duì)應(yīng)地響應(yīng):??????
| public class RemoteControlReceiver extends BroadcastReceiver { ??? @Override ??? public void onReceive(Context context, Intent intent) { ??????? if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { ??????????? KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); ??????????? if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) { ??????????????? // Handle key press. ??????????? } ??????? } ??? } } |
?????? 因?yàn)榭赡苡卸鄠€(gè)程序都同樣監(jiān)聽了這些控制按鈕,那么必須在代碼中特意控制當(dāng)前哪個(gè)Receiver會(huì)進(jìn)行響應(yīng)。
?????? 下面的例子顯示了如何使用AudioManager來注冊(cè)監(jiān)聽與取消監(jiān)聽,通過這種方式,當(dāng)Receiver被注冊(cè)上時(shí),它將是唯一響應(yīng)Broadcast的Receiver。
| AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE); ... // Start listening for button presses am.registerMediaButtonEventReceiver(RemoteControlReceiver); ... // Stop listening for button presses am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); |
?????? 通常,當(dāng)應(yīng)用程序變得不活躍或者不可見時(shí)(像是在onStop())回調(diào)期間),應(yīng)用程序應(yīng)該取消注冊(cè)大多數(shù)的Receiver。但是在媒體播放的時(shí)候并沒有那么簡(jiǎn)單,因?yàn)槲覀冃枰诤笈_(tái)播放歌曲的時(shí)候同樣能夠進(jìn)行響應(yīng)。一個(gè)比較好的注冊(cè)與取消監(jiān)聽的方法是當(dāng)程序獲取與失去音頻焦點(diǎn)的時(shí)候進(jìn)行操作,這個(gè)內(nèi)容會(huì)在后面的課程中詳細(xì)講解。
?
視頻講解:http://www.eyeandroid.com/thread-15877-1-1.html?
轉(zhuǎn)載于:https://www.cnblogs.com/jiangu66/p/3199112.html
總結(jié)
以上是生活随笔為你收集整理的[Android Training视频系列] 8.1 Controlling Your App’s Volume and Playback的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZOJ 2760 How Many Sh
- 下一篇: Android UI开发第二十七篇——实