在Android8.0的Sound Settings中可以看到调整音量分为三种:Media/Alarm/Ring
当用户点击设置时,设置的值范围分别为:
Media 0--15,Alarm 0--7,Ring 0--7
布局文件位于:packages/apps/Settings/res/xml/sound_settings.xml
实现文件位于:packages/apps/Settings/src/com/android/settings/notification/SoundSettings.java
在VolumeSeekBarPreference.java中会为Media初始化点击设置后要播放的sample音频,而Alarm/Ring会在播放时去读系统设定值。
final Uri sampleUri = mStream == AudioManager.STREAM_MUSIC ? getMediaVolumeUri() : null;
继续追下去可以看到真正设置声音是在frameworks/base/core/java/android/preference/SeekBarVolumizer.java中
可以看到若如上设置了sample media的URI,就不会再去设置,反之就会去找系统的URI
if (defaultUri == null) { if (mStreamType == AudioManager.STREAM_RING) { defaultUri = Settings.System.DEFAULT_RINGTONE_URI; } else if (mStreamType == AudioManager.STREAM_NOTIFICATION) { defaultUri = Settings.System.DEFAULT_NOTIFICATION_URI; } else { defaultUri = Settings.System.DEFAULT_ALARM_ALERT_URI; } }
真正设置系统音量的API如下:
mAudioManager.setStreamVolume(mStreamType, mLastProgress, AudioManager.FLAG_SHOW_UI_WARNINGS);