Android AudioManager(音頻管理器)

2023-03-31 14:23 更新

本節(jié)引言:

在多媒體的第一節(jié),我們用SoundPool寫(xiě)了個(gè)Duang的示例,小豬點(diǎn)擊一個(gè)按鈕后,突然發(fā)出"Duang"的 一聲,而且當(dāng)時(shí)的聲音很大,嚇?biāo)缹殞毩?img src="https://atts.w3cschool.cn/attachments/image/cimg/2015-12-02_565e79b2bff83.jpg" alt="">,好在不是上班時(shí)間,上班時(shí)間偷偷寫(xiě)博客給經(jīng)理知道 會(huì)作死的~嗯,好的,說(shuō)到這個(gè)聲音大小就得介紹下Android為我們提供的(音量大小控制)的API:

AudioManager(音頻管理器)了,該類位于Android.Media包下,提供了音量控制與鈴聲模式相關(guān)操作! 本節(jié)我們就來(lái)學(xué)下這個(gè)東東的用法,你可以寫(xiě)一個(gè)Demo,一個(gè)簡(jiǎn)單的靜音,每次看小電影之前,先 進(jìn)Demo點(diǎn)下靜音,然后,說(shuō)說(shuō)而已哈~嗯,話不多說(shuō),開(kāi)始本節(jié)內(nèi)容!

官方API文檔:AudioManager


1.獲得AudioManager對(duì)象實(shí)例

AudioManager audiomanage = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);


2.相關(guān)方法詳解

常用方法

  • adjustVolume(int direction, int flags): 控制手機(jī)音量,調(diào)大或者調(diào)小一個(gè)單位,根據(jù)第一個(gè)參數(shù)進(jìn)行判斷AudioManager.ADJUST_LOWER,可調(diào)小一個(gè)單位; AudioManager.ADJUST_RAISE,可調(diào)大一個(gè)單位
  • adjustStreamVolume(int streamType, int direction, int flags): 同上,不過(guò)可以選擇調(diào)節(jié)的聲音類型 1)streamType參數(shù),指定聲音類型,有下述幾種聲音類型: STREAM_ALARM:手機(jī)鬧鈴 STREAM_MUSIC:手機(jī)音樂(lè) 
    STREAM_RING:電話鈴聲 STREAM_SYSTEAM:手機(jī)系統(tǒng) 
    STREAM_DTMF:音調(diào) STREAM_NOTIFICATION:系統(tǒng)提示
    STREAM_VOICE_CALL:語(yǔ)音電話 2)第二個(gè)參數(shù)和上面那個(gè)一樣,調(diào)大或調(diào)小音量的 3)可選的標(biāo)志位,比如AudioManager.FLAG_SHOW_UI,顯示進(jìn)度條,AudioManager.PLAY_SOUND:播放聲音
  • setStreamVolume(int streamType, int index, intflags):直接設(shè)置音量大小
  • getMode( ):返回當(dāng)前的音頻模式
  • setMode( ):設(shè)置聲音模式 有下述幾種模式: MODE_NORMAL(普通), MODE_RINGTONE(鈴聲), MODE_IN_CALL(打電話),MODE_IN_COMMUNICATION(通話)
  • getRingerMode( ):返回當(dāng)前的鈴聲模式
  • setRingerMode(int streamType):設(shè)置鈴聲模式 有下述幾種模式: 如RINGER_MODE_NORMAL(普通)、RINGER_MODE_SILENT(靜音)、RINGER_MODE_VIBRATE(震動(dòng))
  • getStreamVolume(int streamType): 獲得手機(jī)的當(dāng)前音量,最大值為7,最小值為0,當(dāng)設(shè)置為0的時(shí)候,會(huì)自動(dòng)調(diào)整為震動(dòng)模式
  • getStreamMaxVolume(int streamType):獲得手機(jī)某個(gè)聲音類型的最大音量值
  • setStreamMute(int streamType,boolean state):將手機(jī)某個(gè)聲音類型設(shè)置為靜音
  • setSpeakerphoneOn(boolean on):設(shè)置是否打開(kāi)擴(kuò)音器
  • setMicrophoneMute(boolean on):設(shè)置是否讓麥克風(fēng)靜音
  • isMicrophoneMute():判斷麥克風(fēng)是否靜音或是否打開(kāi)
  • isMusicActive():判斷是否有音樂(lè)處于活躍狀態(tài)
  • isWiredHeadsetOn():判斷是否插入了耳機(jī)

其他方法

  • abandonAudioFocus(AudioManager.OnAudioFocusChangeListenerl):放棄音頻的焦點(diǎn)
  • adjustSuggestedStreamVolume(int,int suggestedStreamType intflags): 調(diào)整最相關(guān)的流的音量,或者給定的回退流
  • getParameters(String keys):給音頻硬件設(shè)置一個(gè)varaible數(shù)量的參數(shù)值
  • getVibrateSetting(int vibrateType):返回是否該用戶的振動(dòng)設(shè)置為振動(dòng)類型
  • isBluetoothA2dpOn():檢查是否A2DP藍(lán)牙耳機(jī)音頻路由是打開(kāi)或關(guān)閉
  • isBluetoothScoAvailableOffCall():顯示當(dāng)前平臺(tái)是否支持使用SCO的關(guān)閉調(diào)用用例
  • isBluetoothScoOn():檢查通信是否使用藍(lán)牙SCO
  • loadSoundEffects():加載聲音效果
  • playSoundEffect((int effectType, float volume):播放聲音效果
  • egisterMediaButtonEventReceiver(ComponentName eventReceiver): 注冊(cè)一個(gè)組件MEDIA_BUTTON意圖的唯一接收機(jī)
  • requestAudioFocus(AudioManager.OnAudioFocusChangeListener l,int streamType,int durationHint) 請(qǐng)求音頻的焦點(diǎn)
  • setBluetoothScoOn(boolean on):要求使用藍(lán)牙SCO耳機(jī)進(jìn)行通訊
  • startBluetoothSco/stopBluetoothSco()():?jiǎn)?dòng)/停止藍(lán)牙SCO音頻連接
  • unloadSoundEffects():卸載音效

3.使用示例

嘿嘿,屬性蠻多的,有些還涉及到藍(lán)牙這些東東,這里我們只講解最常見(jiàn)的一些方法!

遇到一些特殊的沒(méi)見(jiàn)過(guò)的,我們?cè)賮?lái)查文檔!

簡(jiǎn)單的示例:使用Mediaplayer播放音樂(lè),通過(guò)AudioManager調(diào)節(jié)音量大小與靜音!

對(duì)了,先在res下創(chuàng)建一個(gè)raw的文件夾,往里面丟一個(gè)MP3資源文件!

運(yùn)行效果圖

代碼實(shí)現(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;
    //定義一個(gè)標(biāo)志用來(lái)標(biāo)示是否點(diǎn)擊了靜音按鈕
    private int flag = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //獲得系統(tǒng)的音頻對(duì)象
        aManager = (AudioManager) getSystemService(Service.AUDIO_SERVICE);
        //初始化mediaplayer對(duì)象,這里播放的是raw文件中的mp3資源
        mePlayer = MediaPlayer.create(MainActivity.this, R.raw.countingstars);
        //設(shè)置循環(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é)音樂(lè)的音頻,增大音量,而且顯示音量圖形示意
                aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                        AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
                break;
            case R.id.btn_lower:
                // 指定調(diào)節(jié)音樂(lè)的音頻,降低音量,只有聲音,不顯示圖形條
                aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                        AudioManager.ADJUST_LOWER, AudioManager.FLAG_PLAY_SOUND);
                break;
            case R.id.btn_quite:
                // 指定調(diào)節(jié)音樂(lè)的音頻,根據(jù)isChecked確定是否需要靜音
                flag *= -1;
                if (flag == -1) {
                    aManager.setStreamMute(AudioManager.STREAM_MUSIC, true);   //API 23過(guò)期- -
//                    aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE,
//                            AudioManager.FLAG_SHOW_UI);   //23以后的版本用這個(gè)
                    btn_quite.setText("取消靜音");
                } else {
                    aManager.setStreamMute(AudioManager.STREAM_MUSIC, false);//API 23過(guò)期- -
//                    aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_UNMUTE,
//                            AudioManager.FLAG_SHOW_UI);  //23以后的版本用這個(gè)
                    aManager.setMicrophoneMute(false);
                    btn_quite.setText("靜音");
                }
                break;
        }
    }
}

代碼還是非常簡(jiǎn)單的,另外設(shè)置靜音的方法setStreamMute()在API 23版本過(guò)期, 可以使用另一個(gè)方法adjustStreamVolume(int, int, int),然后第三個(gè)屬性設(shè)置:

ADJUST_MUTE 或 ADJUST_UNMUTE!

對(duì)了,還有:

如果adjustStreamVolume()的第三個(gè)參數(shù)你設(shè)置了振動(dòng)(Vibrator), 需要在AndroidManifest.xml中添加這個(gè)權(quán)限哦!

<**uses-permission android:name="android.permission.VIBRATE"**/>

本節(jié)小結(jié):

好的,本節(jié)給大家演示了AudioManager用于調(diào)節(jié)音量的一個(gè)簡(jiǎn)單用法,這個(gè)類筆者也不常用 到,以后如果有什么新get的技能再加上吧~嘿嘿,靜音Demo寫(xiě)好沒(méi)?要結(jié)合實(shí)際需求哈~

另外,本周博客可能不會(huì)更新得太頻繁,本周要把公司的WebSocket庫(kù)替換掉,有得頭痛了~ 好的,就說(shuō)這么多,謝謝~

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)