歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android中的Audio播放:音量和遠程播放控制

Android中的Audio播放:音量和遠程播放控制

日期:2017/3/1 10:25:27   编辑:Linux編程

本文從Audio控制使用的角度,講解了AudioStream的分類,硬件音量控制鍵調整對相應AudioStream音量大小的影響,以及如何響應遠程MediaButton控制Audio播放。

相關閱讀:

Android中的Audio播放:控制Audio輸出通道切換 http://www.linuxidc.com/Linux/2012-04/57901.htm

Android中的Audio播放:競爭Audio之Audio Focus的應用 http://www.linuxidc.com/Linux/2012-04/57902.htm

1. Audio Stream

Android為不同的應用場合定義了不同的Audio Stream: Voice Call, Ring, Music,Alarm, Notification, DTMF。 這些AudioStream是相互獨立的,所以也有各自的音量。AudioStream的定義在android.media.AudioManager中,如下圖所示:


2. 硬件音量控制鍵Vol+/-控制Audio Stream的音量

用戶按下音量控制的HardKey,希望能調出音量調整的界面。

缺省情況下,按下音量控制的硬件控制鍵Vol+/-,調節的是當前被激活的(Active)AudioStream的音量,如果你的程序當前沒有正在播放任何聲音,按下Vol+/-調節的是來電鈴聲的音量。【筆者注:基本是翻譯的原話,需要明確!By default, pressing the volume controls modifythe volume of the active audio stream. If your app isn't currently playing anything, hitting the volume keys adjusts the ringer volume.】


在某一個程序運行時,希望按下Vol+/-調節的是當前所使用的AudioStream的音量,Android在Activity中提供了setVolumeControlStream()方法用來指定你的應用程序使用的Audio Stream類型。所以,如果你的程序用到Audio的播放,你首先要知道你的程序所用的Audio Stream類型,並在onCreate()中調用setVolumeControlStream()來設定Audio Stream的類型

Q:setVolumeControlStream()之後就起效,還是可見之後才有用?後台播放呢?

要明確這些標紅的地方,需要看Android的內部實現!//TODO:明確化;內部實現,另外專題寫…

3. 遙控Audio Playback

有些耳機上有諸如音量控制、切換前一首下一首歌、播放/暫停等控制鍵,Bluetooth的AVRCP Profile也能遠程控制的。這些鍵被按下後,Android是通過broadcast ACTION_MEDIA_BUTTON這個Intent發出去的。

所以,要在你的應用中處理這些按鍵,只要偵聽這個廣播,並處理即可。

如果知道什麼時候開始偵聽廣播,程序中動態注冊/注銷偵聽都是很好的選擇(與,寫在AndroidManifest中,apk加載時就注冊相比)。而Audio控制在什麼時候才處理這些鍵值是比較明確的,一般獲得AudioFocus的情況下,響應ACTION_MEDIA_BUTTON廣播;失去Audio Focus的情況下,不響應ACTION_MEDIA_BUTTON廣播,這也就是相應registerMediaButtonEventReceiver()/unregisterMediaButtonEventReceiver()的最佳時機。

ACTION_MEDIA_BUTTON廣播的處理,只要在override onReceive(),並在其中通過判斷是否Intent.ACTION_MEDIA_BUTTON確保是這個廣播,從Intent.EXTA_KEY_EVENT中獲得KeyEvent,做相應的處理即可。

涉及的幾個類的關系圖如下:


相應處理的代碼片段如下:

  1. public class RemoteControlReceiver extends BroadcastReceiver {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
  5. KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
  6. if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) {
  7. // Handle key press.
  8. }
  9. }
  10. }
  11. }

總結一下要點:

1. Android的Audio控制是按照Audio Stream劃分的;

2. 各個Audio Stream的音量是獨立的。推薦在onCreate()中通過Activity.setVolumeControlStream()方法設置所使用AudioStream的類型,實現按下硬鍵Vol+/-調整的是相對應AudioStream的音量;

3. 偵聽Intent.ACTION_MEDIA_BUTTON廣播實現對遠程Media控制的處理。

主要參考資源:

1. Controllingyour app’s volume and playback

2. Android Reference API.

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved