[Android Training视频系列] 8.1 Controlling Your App’s Volume and Playback
主要內容:
1 鑒別使用的是哪個音頻流
2 使用物理音量鍵控制應用程序的音量
3 使用物理播放控制鍵來控制應用程序的音頻播放
視頻講解:http://www.eyeandroid.com/thread-15877-1-1.html
控制應用程序的音量和音頻的播放
?
?????? 一個好的用戶體驗是可預期可控的。如果應用程序是在播放音頻,那么顯然我們需要做到能夠通過硬件按鈕、軟件按鈕、藍牙耳麥等來控制音量。
?????? 同樣的,我們需要能夠監聽Media Button發出的播放、停止、暫停、跳過、上一首等動作,并且在應用程序所使用的Audio Stream上進行對應的響應。
?????? 鑒別使用的是哪個音頻流
?????? 首先需要知道的是我們的應用程序會使用到哪些音頻流。
?????? Android為播放音樂、鬧鈴、通知鈴、來電聲音、系統聲音,打電話聲音與DTMF頻道分別維護了一個隔離的音頻流。這是我們能夠控制不同音頻的前提。
?????? 這些音頻流中大多數都是被系統限制的,不能胡亂使用。除了你的應用程序是需要做替換鬧鈴操作,幾乎其他的播放音頻操作都是使用"STREAM_MUSIC"音頻流。
?????? 使用硬件音量鍵來控制應用程序的音量
?????? 默認情況下,按下音量控制鍵會調節當前被激活的音頻流,如果此時你的應用程序沒有任何聲音在播放,則會調節鈴聲的音量。
?????? 如果你的應用程序是一個游戲或者音樂程序,需要在不管是否目前正在播放歌曲或者游戲是否發出聲音,按硬件的音量鍵都會使其音量得到調節。
?????? 我們需要監聽音量鍵是否被按下,Android提供了setVolumeControlStream()的方法來直接控制指定的音頻流的音量。
?????? 在鑒別出應用程序會使用哪個音頻流之后,需要在Activity或者Fragment的onCreate中就調用setVolumeControlStream,這樣能確保不管應用程序是否可見,音頻控制功能都以用戶的預期工作。
| setVolumeControlStream(AudioManager.STREAM_MUSIC); |
?????? 使用硬件的播放控制按鍵來控制應用程序音頻播放
?????? 媒體播放按鈕,例如播放, 暫停, 停止, 跳過, 上一首等功能同樣可以在一些線控,耳麥或者其他無線控制設備上實現。無論用戶按下上面任何設備上的控制按鈕,系統都會廣播一個帶有ACTION_MEDIA_BUTTON的Intent。
?????? 為了響應那些操作,需要像下面一樣注冊一個BroadcastReceiver在Manifest文件中。?????
| <receiver android:name=".RemoteControlReceiver"> ??? <intent-filter> ??????? <action android:name="android.intent.action.MEDIA_BUTTON" /> ??? </intent-filter> </receiver> |
?????? Receiver需要判斷這個廣播是來自哪個按鈕的操作,Intent在EXTRA_KEY_EVENT中包含了KEY信息,同樣KeyEvent類包含了一系列KEYCODE_MEDIA_*的靜態變量來表示不同的媒體按鈕,例如KEYCODE_MEDIA_PLAY_PAUSE 和 KEYCODE_MEDIA_NEXT.
?????? 下面的代碼演示如何獲取按下的媒體按鍵以及如何對應地響應:??????
| 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. ??????????? } ??????? } ??? } } |
?????? 因為可能有多個程序都同樣監聽了這些控制按鈕,那么必須在代碼中特意控制當前哪個Receiver會進行響應。
?????? 下面的例子顯示了如何使用AudioManager來注冊監聽與取消監聽,通過這種方式,當Receiver被注冊上時,它將是唯一響應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); |
?????? 通常,當應用程序變得不活躍或者不可見時(像是在onStop())回調期間),應用程序應該取消注冊大多數的Receiver。但是在媒體播放的時候并沒有那么簡單,因為我們需要在后臺播放歌曲的時候同樣能夠進行響應。一個比較好的注冊與取消監聽的方法是當程序獲取與失去音頻焦點的時候進行操作,這個內容會在后面的課程中詳細講解。
?
視頻講解:http://www.eyeandroid.com/thread-15877-1-1.html?
轉載于:https://www.cnblogs.com/jiangu66/p/3199112.html
總結
以上是生活随笔為你收集整理的[Android Training视频系列] 8.1 Controlling Your App’s Volume and Playback的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZOJ 2760 How Many Sh
- 下一篇: 静态库和动态库详解(部分参考别人)