AudioManager(音訊管理器)
本節引言:
在多媒體的第一節,我們用SoundPool寫了個Duang的範例,小豬點擊一個按鈕後,突然發出"Duang"的 一聲,而且當時的聲音很大,嚇死寶寶了,好在不是上班時間,上班時間偷偷寫博客給經理知道 會作死的~嗯,好的,說到這個聲音大小就得介紹下Android為我們提供的(音量大小控制)的API:
AudioManager(音頻管理器)了,該類別位於Android.Media套件下,提供了音量控制與鈴聲模式相關操作! 本節我們就來學下這個東東的用法,你可以寫一個Demo,一個簡單的靜音,每次看小電影之前,先 進Demo點下靜音,然後,說說而已哈~嗯,話不多說,開始本節內容!
官方API文件:AudioManager
#1.取得AudioManager物件實例
##AudioManager audiomanage = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
2.相關方法詳解##常用方法
:
###常用方法###:###
- adjustVolume(int direction, int flags): 控製手機音量,調大或調小一個單位,根據第一個參數進行判斷AudioManager.ADJUST_LOWER,可調小一個單位;AudioManager.ADJUST_RAISE,可調大一個單位
- adjustStreamVolume(int streamType, int direction, int flags): 同上,不過可以選擇調整的聲音類型 1)streamType參數,指定聲音類型,有下述幾種聲音類型:STREAM_ALARM:手機鬧鈴 STREAM_MUSIC:手機音樂
getMode
##STREAM_RING##STREAM_RING##:電話:電話通話鈴聲 STREAM_SYSTEAM:手機系統 STREAM_DTMF
#:音調 STREAM_NO##STREAM_NO#PATION #O4m#Pet#ND:#DIDICE_PD:#STREAM_NO#Pel_PPIDUP:#ND:#P手機1_DID4U3_D:LJ 2)第二個參數和上面那個一樣,調大或調小音量的 3)可選的標誌位元,例如AudioManager.FLAG_SHOW_UI,顯示進度條,AudioManager.PLAY_SOUND
:播放聲音#setStreamVolume(int streamType, int index, intflags):直接設定音量大小- ( ):傳回目前的音訊模式
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的時候,會自動調整為震動模式
#getStreamMaxVolume- (int streamType):取得手機某個聲音類型的最大音量值
setStreamMute- (int streamType,boolean state):將手機某個聲音類型設為靜音
setSpeakerphoneOn- (boolean on):設定是否開啟擴音器
setMicrophoneMute- (boolean on):設定是否讓麥克風靜音
isMicrophoneMute- ():判斷麥克風是否靜音或是否開啟
isMusicActive- ():判斷是否有音樂處於活躍狀態
isWiredHeadsetOn- ():判斷是否插入了耳機
- 其他方法:
- abandonAudioFocus(AudioManager.OnAudioFocusChangeListenerl):放棄音訊的焦點
- ##adjustSuggestedStreamVolume(int,int suggestedStreamType intflags): 調整最相關的流的音量,或給定的回退流
- getParameters(String keys):給音訊硬體設定一個varaible數量的參數值
- #getVibrateSetting(int vibrateType):傳回是否該使用者的震動設定為震動類型
- isBluetoothA2dpOn():檢查是否A2DP藍牙耳機音訊路由是開啟或關閉
- isBluetoothScoAvailableOffCall():顯示目前平台是否支援使用SCO的關閉呼叫案例
- 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調整音量大小與靜音!
對了,先在res下方建立一個raw的資料夾,往裡面丟一個MP3資源檔!執行效果圖
:
#程式碼實作:
#版面程式碼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="调高音量" /> <Button android:id="@+id/btn_lower" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="调低音量" /> <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); //获得系统的音频对象 aManager = (AudioManager) getSystemService(Service.AUDIO_SERVICE); //初始化mediaplayer对象,这里播放的是raw文件中的mp3资源 mePlayer = MediaPlayer.create(MainActivity.this, R.raw.countingstars); //设置循环播放: 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: // 指定调节音乐的音频,增大音量,而且显示音量图形示意 aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI); break; case R.id.btn_lower: // 指定调节音乐的音频,降低音量,只有声音,不显示图形条 aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, AudioManager.FLAG_PLAY_SOUND); break; case R.id.btn_quite: // 指定调节音乐的音频,根据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###()的第三個參數你設定了振動(Vibrator), 需要在AndroidManifest.xml中加入這個權限喔!###<**uses-permission android:name="android.permission.VIBRATE"**/>######4.程式碼範例下載#########AudioManagerDemo.zip######本節小結:
好的,本節為大家示範了AudioManager用來調整音量的一個簡單用法,這個類別筆者也不常用 到,以後如果有什麼新get的技能再加上吧~嘿嘿,靜音Demo寫好沒?要結合實際需求哈~
另外,本週部落格可能不會更新得太頻繁,本週要把公司的WebSocket庫替換掉,有得頭痛了~ 好的,就說這麼多,謝謝~