AudioManager(音頻管理器)
本節(jié)引言:
在多媒體的第一節(jié),我們用SoundPool寫了個Duang的示例,小豬點擊一個按鈕后,突然發(fā)出"Duang"的 一聲,而且當時的聲音很大,嚇死寶寶了
,好在不是上班時間,上班時間偷偷寫博客給經(jīng)理知道 會作死的~嗯,好的,說到這個聲音大小就得介紹下Android為我們提供的(音量大小控制)的API:
AudioManager(音頻管理器)了,該類位于Android.Media包下,提供了音量控制與鈴聲模式相關操作! 本節(jié)我們就來學下這個東東的用法,你可以寫一個Demo,一個簡單的靜音,每次看小電影之前,先 進Demo點下靜音,然后
,說說而已哈~嗯,話不多說,開始本節(jié)內(nèi)容!
官方API文檔:AudioManager
1.獲得AudioManager對象實例
AudioManager audiomanage = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
2.相關方法詳解
常用方法:
- adjustVolume(int direction, int flags): 控制手機音量,調(diào)大或者調(diào)小一個單位,根據(jù)第一個參數(shù)進行判斷AudioManager.ADJUST_LOWER,可調(diào)小一個單位;AudioManager.ADJUST_RAISE,可調(diào)大一個單位
- adjustStreamVolume(int streamType, int direction, int flags): 同上,不過可以選擇調(diào)節(jié)的聲音類型 1)streamType參數(shù),指定聲音類型,有下述幾種聲音類型:STREAM_ALARM:手機鬧鈴 STREAM_MUSIC:手機音樂
STREAM_RING:電話鈴聲 STREAM_SYSTEAM:手機系統(tǒng)
STREAM_DTMF:音調(diào) STREAM_NOTIFICATION:系統(tǒng)提示
STREAM_VOICE_CALL:語音電話 2)第二個參數(shù)和上面那個一樣,調(diào)大或調(diào)小音量的 3)可選的標志位,比如AudioManager.FLAG_SHOW_UI,顯示進度條,AudioManager.PLAY_SOUND:播放聲音- setStreamVolume(int streamType, int index, intflags):直接設置音量大小
- getMode( ):返回當前的音頻模式
- setMode( ):設置聲音模式 有下述幾種模式:MODE_NORMAL(普通), MODE_RINGTONE(鈴聲),MODE_IN_CALL(打電話),MODE_IN_COMMUNICATION(通話)
- getRingerMode( ):返回當前的鈴聲模式
- setRingerMode(int streamType):設置鈴聲模式 有下述幾種模式: 如RINGER_MODE_NORMAL(普通)、RINGER_MODE_SILENT(靜音)、RINGER_MODE_VIBRATE(震動)
- getStreamVolume(int streamType): 獲得手機的當前音量,最大值為7,最小值為0,當設置為0的時候,會自動調(diào)整為震動模式
- getStreamMaxVolume(int streamType):獲得手機某個聲音類型的最大音量值
- setStreamMute(int streamType,boolean state):將手機某個聲音類型設置為靜音
- setSpeakerphoneOn(boolean on):設置是否打開擴音器
- setMicrophoneMute(boolean on):設置是否讓麥克風靜音
- isMicrophoneMute():判斷麥克風是否靜音或是否打開
- isMusicActive():判斷是否有音樂處于活躍狀態(tài)
- isWiredHeadsetOn():判斷是否插入了耳機
其他方法:
- abandonAudioFocus(AudioManager.OnAudioFocusChangeListenerl):放棄音頻的焦點
- adjustSuggestedStreamVolume(int,int suggestedStreamType intflags): 調(diào)整最相關的流的音量,或者給定的回退流
- getParameters(String keys):給音頻硬件設置一個varaible數(shù)量的參數(shù)值
- getVibrateSetting(int vibrateType):返回是否該用戶的振動設置為振動類型
- isBluetoothA2dpOn():檢查是否A2DP藍牙耳機音頻路由是打開或關閉
- isBluetoothScoAvailableOffCall():顯示當前平臺是否支持使用SCO的關閉調(diào)用用例
- isBluetoothScoOn():檢查通信是否使用藍牙SCO
- loadSoundEffects():加載聲音效果
- playSoundEffect((int effectType, float volume):播放聲音效果
- egisterMediaButtonEventReceiver(ComponentName eventReceiver): 注冊一個組件MEDIA_BUTTON意圖的唯一接收機
- requestAudioFocus(AudioManager.OnAudioFocusChangeListener l,int streamType,int durationHint) 請求音頻的焦點
- setBluetoothScoOn(boolean on):要求使用藍牙SCO耳機進行通訊
- startBluetoothSco/stopBluetoothSco()():啟動/停止藍牙SCO音頻連接
- unloadSoundEffects():卸載音效
3.使用示例
嘿嘿,屬性蠻多的,有些還涉及到藍牙這些東東,這里我們只講解最常見的一些方法!
遇到一些特殊的沒見過的,我們再來查文檔!
簡單的示例:使用Mediaplayer播放音樂,通過AudioManager調(diào)節(jié)音量大小與靜音!
對了,先在res下創(chuàng)建一個raw的文件夾,往里面丟一個MP3資源文件!
運行效果圖:
代碼實現(xiàn):
布局代碼activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/btn_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="播放" /> <Button android:id="@+id/btn_stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:enabled="false" android:text="停止" /> <Button android:id="@+id/btn_higher" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="調(diào)高音量" /> <Button android:id="@+id/btn_lower" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="調(diào)低音量" /> <Button android:id="@+id/btn_quite" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="靜音" /></LinearLayout>
MainActivity.java:
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_start; private Button btn_stop; private Button btn_higher; private Button btn_lower; private Button btn_quite; private MediaPlayer mePlayer; private AudioManager aManager; //定義一個標志用來標示是否點擊了靜音按鈕 private int flag = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //獲得系統(tǒng)的音頻對象 aManager = (AudioManager) getSystemService(Service.AUDIO_SERVICE); //初始化mediaplayer對象,這里播放的是raw文件中的mp3資源 mePlayer = MediaPlayer.create(MainActivity.this, R.raw.countingstars); //設置循環(huán)播放: mePlayer.setLooping(true); bindViews(); } private void bindViews() { btn_start = (Button) findViewById(R.id.btn_start); btn_stop = (Button) findViewById(R.id.btn_stop); btn_higher = (Button) findViewById(R.id.btn_higher); btn_lower = (Button) findViewById(R.id.btn_lower); btn_quite = (Button) findViewById(R.id.btn_quite); btn_start.setOnClickListener(this); btn_stop.setOnClickListener(this); btn_higher.setOnClickListener(this); btn_lower.setOnClickListener(this); btn_quite.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_start: btn_stop.setEnabled(true); mePlayer.start(); btn_start.setEnabled(false); break; case R.id.btn_stop: btn_start.setEnabled(true); mePlayer.pause(); btn_stop.setEnabled(false); break; case R.id.btn_higher: // 指定調(diào)節(jié)音樂的音頻,增大音量,而且顯示音量圖形示意 aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI); break; case R.id.btn_lower: // 指定調(diào)節(jié)音樂的音頻,降低音量,只有聲音,不顯示圖形條 aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, AudioManager.FLAG_PLAY_SOUND); break; case R.id.btn_quite: // 指定調(diào)節(jié)音樂的音頻,根據(jù)isChecked確定是否需要靜音 flag *= -1; if (flag == -1) { aManager.setStreamMute(AudioManager.STREAM_MUSIC, true); //API 23過期- - // aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE, // AudioManager.FLAG_SHOW_UI); //23以后的版本用這個 btn_quite.setText("取消靜音"); } else { aManager.setStreamMute(AudioManager.STREAM_MUSIC, false);//API 23過期- - // aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_UNMUTE, // AudioManager.FLAG_SHOW_UI); //23以后的版本用這個 aManager.setMicrophoneMute(false); btn_quite.setText("靜音"); } break; } } }
代碼還是非常簡單的,另外設置靜音的方法setStreamMute()在API 23版本過期, 可以使用另一個方法adjustStreamVolume(int, int, int),然后第三個屬性設置:
ADJUST_MUTE 或 ADJUST_UNMUTE!
對了,還有:
如果adjustStreamVolume()的第三個參數(shù)你設置了振動(Vibrator), 需要在AndroidManifest.xml中添加這個權(quán)限哦!
<**uses-permission android:name="android.permission.VIBRATE"**/>
4.代碼示例下載
本節(jié)小結(jié):
好的,本節(jié)給大家演示了AudioManager用于調(diào)節(jié)音量的一個簡單用法,這個類筆者也不常用 到,以后如果有什么新get的技能再加上吧~嘿嘿,靜音Demo寫好沒?要結(jié)合實際需求哈~
另外,本周博客可能不會更新得太頻繁,本周要把公司的WebSocket庫替換掉,有得頭痛了~ 好的,就說這么多,謝謝~