Android SDK提供了一个类来控制系统音量和振动的更改api,android.media.AudioManager 通过这个类,我们将手机设置为静音或者振动,和更改振动的类型。AudioManager无法在代码中实例化,需要通过AudioManager audiomanage = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);获取到其实例。audiomanager就是我们定义的声音的对象。,我们可以通过调用AudioManager的方法setRingerMode来控制声音的类型。setRingerMode方法接受一个参数,我们只要根据需要更改的类型值传入就可以拉。这3个分别是:
public static final int RINGER_MODE_SILENT = 0;//静音模式
public static final int RINGER_MODE_VIBRATE = 1;//震动模式
public static final int RINGER_MODE_NORMAL = 2; //普通
一:audiomanager对象分析
先获取AudioManager实例,
AudioManager mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
1.通话音量
int max = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL );
int current = mAudioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL );
2.系统音量
int max = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_SYSTEM );
current = mAudioManager.getStreamVolume(AudioManager.STREAM_SYSTEM );
3.铃声音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_RING);
current = mAudioManager.getStreamVolume(AudioManager.STREAM_RING );
3.音乐音量
max = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC );
current = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC );
4.提示声音音量
max = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM );
current = mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM );
另外需要知道的一些方法:
adjustVolume(int direction, int flags) ——用来控制手机音量大小,当传入的第一个参数为AudioManager.ADJUST_LOWER 时,可将音量调小一个单位,传入AudioManager.ADJUST_RAISE时,则可以将音量调大一个单位。
adjustStreamVolume(int streamType, int direction, intflags)——调节手机音量大小参数1:声音类型,可取为STREAM_VOICE_CALL(通话)、STREAM_SYSTEM(系统声音)、STREAM_RING(铃声)、STREAM_MUSIC(音乐)、STREAM_ALARM(闹铃声)
参数2:调整音量的方向,可取ADJUST_LOWER(降低)、ADJUST_RAISE(升高)、ADJUST_SAME
参数3:可选的标志位
setStreamVolume(int streamType, int index, intflags)——直接设置音量大小
getMode() ——返回当前音频模式,如 NORMAL(普通), RINGTONE(铃声), IN_CALL(通话)
setMode()——设置声音模式,可取值NORMAL(普通), RINGTONE(铃声), IN_CALL(通话)
getRingerMode()——返回当前的铃声模式。如RINGER_MODE_NORMAL(普通)、RINGER_MODE_SILENT(静音)、RINGER_MODE_VIBRATE(震动)
setRingerMode(int ringerMode) ——改变铃声模式
getStreamVolume(int streamType)——取得当前手机的音量,最大值为7,最小值为0,当为0时,手机自动将模式调整为“震动模式”。
getStreamMaxVolume(int streamType)——获得当前手机最大铃声。
setStreamMute(int streamType, boolean state
//音量控制,初始化定义
AudioManager mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
//最大音量
int maxVolume =mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
//当前音量
int currentVolume =mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
//关于标志flag 的用法:降低音量,调出系统音量控制
<span style="font-size:18px;">if(flag ==0){
mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_LOWER,
AudioManager.FX_FOCUS_NAVIGATION_UP);
}else if(flag ==1){//增加音量,调出系统音量控制
mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_RAISE,
AudioManager.FX_FOCUS_NAVIGATION_UP);
}</span>
二:震动类型
关于振动类型:
1:VIBRATE_SETTING_ON //总是震动
2:VIBRATE_SETTING_OFF //从不震动
3:VIBRATE_SETTING_ONLY_SILENT //静音下震动
4:VIBRATE_SETTING_ON //非静音下震动
知道了这些类型,看看怎么实现。
int vibrate_setting = -1;
int ring_mode = -1;
switch(profile.vibrate) {
case ProfileConstants.VIBRATE_ALWAYS_ON:// 总是振动
vibrate_setting = AudioManager.VIBRATE_SETTING_ON;
ring_mode = 1;
break;
case ProfileConstants.VIBRATE_NEVER://从不振动
vibrate_setting = AudioManager.VIBRATE_SETTING_OFF;
ring_mode = 0;
break;
case ProfileConstants.VIBRATE_ONLY_IN_SILENT://静音下振动
vibrate_setting = AudioManager.VIBRATE_SETTING_ONLY_SILENT;
ring_mode = 1;
break;
case ProfileConstants.VIBRATE_UNLESS_SILENT://非静音下振动
vibrate_setting = AudioManager.VIBRATE_SETTING_ON;
ring_mode = 0;
break;
}
Settings.System.putInt(resolver, "vibrate_in_silent", ring_mode);
audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, vibrate_setting);
这样以来我们就实现了和系统提供的振动类型相同的功能了。