AudioManager(音訊管理器)


本節引言:

在多媒體的第一節,我們用SoundPool寫了個Duang的範例,小豬點擊一個按鈕後,突然發出"Duang"的 一聲,而且當時的聲音很大,嚇死寶寶了1.jpg,好在不是上班時間,上班時間偷偷寫博客給經理知道 會作死的~嗯,好的,說到這個聲音大小就得介紹下Android為我們提供的(音量大小控制)的API:

AudioManager(音頻管理器)了,該類別位於Android.Media套件下,提供了音量控制與鈴聲模式相關操作! 本節我們就來學下這個東東的用法,你可以寫一個Demo,一個簡單的靜音,每次看小電影之前,先 進Demo點下靜音,然後2.gif,說說而已哈~嗯,話不多說,開始本節內容!

官方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:手機音樂       
    ##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):直接設定音量大小
  • 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的時候,會自動調整為震動模式
  • #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.使用範例

    3.gif

    #嘿嘿,屬性蠻多的,有些還牽涉到藍牙這些東東,這裡我們只講解最常見的一些方法!

    遇到一些特殊的沒見過的,我們再來查文件!

    簡單的範例:使用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寫好沒?要結合實際需求哈~4.gif

    另外,本週部落格可能不會更新得太頻繁,本週要把公司的WebSocket庫替換掉,有得頭痛了~ 好的,就說這麼多,謝謝~