最近在看Android 5.0的代码,发现可以通过音量键来控制情景模式,而且在此次升级的静音模式可谓是完全静音了,就连闹钟都不会发音。
我要做一个可以在静音模式下选择闹钟是否仍然响铃的开关。
本文仅为学习笔记,大神勿喷。
在DeskClock源码中,com.android.deskclock.SettingsActivity.java 中
有如下字段来记录在静音模式下是否响闹钟铃音,不过这个在4.4开始功能就被移除了。
public static final String KEY_ALARM_IN_SILENT_MODE = "alarm_in_silent_mode";
private void refresh() {
....
//这个在5.0中已经被移除
final CheckBoxPreference alarmInSilentModePref =
(CheckBoxPreference) findPreference(KEY_ALARM_IN_SILENT_MODE);
final int silentModeStreams =
Settings.System.getInt (getContentResolver(),
Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);
alarmInSilentModePref.setChecked(
(silentModeStreams & ALARM_STREAM_TYPE_BIT) == 0);
}
是由一个CheckBox开关来控制如下。
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
Preference preference) {
if (KEY_ALARM_IN_SILENT_MODE.equals(preference.getKey())) {
CheckBoxPreference pref = (CheckBoxPreference) preference;
int ringerModeStreamTypes = Settings.System.getInt(
getContentResolver(),
Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);
if (pref.isChecked()) {
ringerModeStreamTypes &= ~ALARM_STREAM_TYPE_BIT;
} else {
ringerModeStreamTypes |= ALARM_STREAM_TYPE_BIT;
}
Settings.System.putInt(getContentResolver(),
Settings.System.MODE_RINGER_STREAMS_AFFECTED,
ringerModeStreamTypes);
return true;
}
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
//原来这个通过音量键控制的情景模式窗口实在SystemUI中实现的
com.android.systemui.volume.ZenModePanel.java
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mZenButtons = (SegmentedButtons) findViewById(R.id.zen_buttons);
//在这里创建了三个按钮,接下来看下addButton方法
mZenButtons.addButton(R.string.interruption_level_none, Global.ZEN_MODE_NO_INTERRUPTIONS);
mZenButtons.addButton(R.string.interruption_level_priority,
Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS);
mZenButtons.addButton(R.strin