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(.activity_audio);
initData();
mBroadcast = new MyRingerBroadcast();
IntentFilter intent = new IntentFilter();
(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 = ();
(TAG, "initData: mode=" + mode);
}
/**
* 静音模式
*
* @param view
*/
public void silent(View view) {
(AudioManager.RINGER_MODE_SILENT);
}
/**
* 震动模式
*
* @param view
*/
public void vibrate(View view) {
(AudioManager.RINGER_MODE_VIBRATE);
int mode = ();
(TAG, "initData: mode=" + mode);
}
/**
* 正常模式
*
* @param view
*/
public void normal(View view) {
(AudioManager.RINGER_MODE_NORMAL);
int mode = ();
(TAG, "initData: mode=" + mode);
}
/**
* 单步调整媒体声音
*/
public void adjustMusicVolume() {
int curVolume = (STREAM_MUSIC);
for (int i = 0; i <= curVolume; i++) {
(STREAM_MUSIC, ADJUST_RAISE, FLAG_SHOW_UI);
}
}
/**
* 调整某个指定音频流的声音的音量
*/
public void setMusicVolume() {
int curVolume = (STREAM_MUSIC);
(STREAM_MUSIC, curVolume , 0)
}
private MyRingerBroadcast mBroadcast;
/**
*监听响铃模式切换
*/
private class MyRingerBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = ();
int mode = (AudioManager.EXTRA_RINGER_MODE, -1);
(TAG, "onReceive: action==" + action + " the mode=" + mode);
}
}
}
小米手机在静音模式下没有媒体声音的解决方案
一般手机在设置为静音模式下依然保持媒体声音,也就是在静音模式下,播放音乐,视频依然有声音。但是小米手机在设置为静音模式同时将媒体声音自动调整为0。为了解决小米手机在设置静音模式下依然保持媒体声音,解决方案为:在设置静音的同时延时大概500ms之后调整媒体声音到静音之前的声音。
//设置静音
int curVolume = (STREAM_MUSIC);
(AudioManager.RINGER_MODE_SILENT);
(new Runnable() {
@Override
public void run() {
(STREAM_MUSIC, curVolume , 0);
}
}, 500);
注意:这里为何要延时500ms之后才去调整媒体声音呢?因为不延时调整媒体声音会无效。声音涉及到硬件资源,设置静音模式后立马去调整声音可能资源还没有及时释放,所以延时500ms等待硬件资源释放后在去调整媒体声音及有效了。