AudioManager 的作用 :调整音量和控制响铃模式

声音分类

  • STREAM_VOICE_CALL:通话声音
  • STREAM_SYSTEM:系统声音,包括按键声音等
  • STREAM_RING:来电响铃
  • STREAM_MUSIC:媒体声音(包括音乐,视频,游戏声音)
  • STREAM_ALARM:闹钟声音
  • STREAM_NOTIFICATION:通知声音

声音模式分类

  • RINGER_MODE_NORMAL:正常模式
    所有声音都正常,包括系统声音,来电响铃,媒体声音,闹钟,通知声音都有
  • RINGER_MODE_SILENT:静音模式
    该模式下,来电响铃,通知,系统声音和震动都没有;闹钟,通话声音保持;大部分手机媒体声音依然有,但是小米和少部分oppo手机在设置静音的同时会将媒体声音自动调整为0,此时没有媒体声音
  • RINGER_MODE_VIBRATE:震动模式
    该模式下,来电,通知保持震动没有声音;但是媒体,闹钟依然有声音。不过小米手机只有正常模式和静音模式,没有震动模式

控制声音模式的方法

  • setRingerMode(int):设置指定的响铃模式
  • getRingerMode():得到当前的响铃模式

响铃模式改变的广播

  • action:RINGER_MODE_CHANGED_ACTION
  • extra:EXTRA_RINGER_MODE

控制音量

  • adjustStreamVolume(int streamType, int direction, int flags):单步控制指定声音的音量,第一个参数为音频流类型,第二个参数为加音量还是减音量,第三个参数为flags,默认为0即可。
  • setStreamVolume(int streamType, int index, int flags):指定设置声音的音量,第一个参数为音频流类型,第二个参数为调整的音量大小,第三个参数为flags,默认为0既可。
  • getStreamVolume(int streamType):得到指定音频流当前的音量
  • getStreamMaxVolume(int streamType):得到指定音频流的最大音量

扬声器控制

  • setSpeakerphoneOn(boolean on):控制扬声器开或者关
  • isSpeakerphoneOn():判断当前扬声器是开还是关

麦克风控制

  • setMicrophoneMute(boolean on):设置麦克风静音开或者关
  • isMicrophoneMute():判断麦克风是否静音

检查是否插入耳机

  • isWiredHeadsetOn():检查是否插入耳机

demo

public class AudioActivity extends Activity {
    private AudioManager mAudioManager;
    private static final String TAG = "AudioActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_audio);
        initData();

        mBroadcast = new MyRingerBroadcast();
        IntentFilter intent = new IntentFilter();
        intent.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
        registerReceiver(mBroadcast, intent);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mBroadcast);
    }

    private void initData() {
        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        int mode = mAudioManager.getRingerMode();
        Log.i(TAG, "initData: mode=" + mode);
    }


    /**
     * 静音模式
     *
     * @param view
     */
    public void silent(View view) {
        mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
    }

    /**
     * 震动模式
     *
     * @param view
     */
    public void vibrate(View view) {
        mAudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
        int mode = mAudioManager.getRingerMode();
        Log.i(TAG, "initData: mode=" + mode);
    }

    /**
     * 正常模式
     *
     * @param view
     */
    public void normal(View view) {
        mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
        int mode = mAudioManager.getRingerMode();
        Log.i(TAG, "initData: mode=" + mode);
    }

    /**
     * 单步调整媒体声音
     */
    public void adjustMusicVolume() {
        int curVolume = mAudioManager.getStreamVolume(STREAM_MUSIC);
        for (int i = 0; i <= curVolume; i++) {
            mAudioManager.adjustStreamVolume(STREAM_MUSIC, ADJUST_RAISE, FLAG_SHOW_UI);
        }
    }
    /**
    * 调整某个指定音频流的声音的音量
    */
    public void setMusicVolume() {
        int curVolume = mAudioManager.getStreamVolume(STREAM_MUSIC);
        mAudioManager.setStreamVolume(STREAM_MUSIC, curVolume , 0)
    }

    private MyRingerBroadcast mBroadcast;

    /**
     *监听响铃模式切换
     */
    private class MyRingerBroadcast extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            int mode = intent.getIntExtra(AudioManager.EXTRA_RINGER_MODE, -1);
            Log.i(TAG, "onReceive: action==" + action + " the mode=" + mode);
        }
    }

}

小米手机在静音模式下没有媒体声音的解决方案

一般手机在设置为静音模式下依然保持媒体声音,也就是在静音模式下,播放音乐,视频依然有声音。但是小米手机在设置为静音模式同时将媒体声音自动调整为0。为了解决小米手机在设置静音模式下依然保持媒体声音,解决方案为:在设置静音的同时延时大概500ms之后调整媒体声音到静音之前的声音。

//设置静音
int curVolume = mAudioManager.getStreamVolume(STREAM_MUSIC);
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mAudioManager.setStreamVolume(STREAM_MUSIC, curVolume , 0);
                }
            }, 500);

注意:这里为何要延时500ms之后才去调整媒体声音呢?因为不延时调整媒体声音会无效。声音涉及到硬件资源,设置静音模式后立马去调整声音可能资源还没有及时释放,所以延时500ms等待硬件资源释放后在去调整媒体声音及有效了。