Android 手机设置中铃声设置里的通知音量与铃声音量的分离

来源:互联网 发布:淘宝客服兼职可靠吗 编辑:程序博客网 时间:2024/04/29 17:22

android 手机设置-声音与震动 设置里铃声音量与通知音量通常被绑定到了一起,按音量键调节来电铃声大小时,来电短信声音也会跟着变,其实这两个音量是可以分开设置的.效果就是打开手机设置-铃声与震动(不同品牌的手机叫法不同),会看见在原来的铃声调节进度条上面或者下面会多出一个音量调节进度条(即要分离出的通知音量进度条),同时在SystemUI的音量显示进度条里也会多出一条通知音量调节的进度条,并且二者可以实现同步.下面源码介绍如何分离.(此处源码基于Android7.0)
(1)首先在frameworks/base/services/core/java/com/android/server/audio/AudioService.java
定位到private final int[] STREAM_VOLUME_ALIAS_VOICE = new int[] {
AudioSystem.STREAM_VOICE_CALL, // STREAM_VOICE_CALL
AudioSystem.STREAM_RING, // STREAM_SYSTEM
AudioSystem.STREAM_RING, // STREAM_RING
AudioSystem.STREAM_MUSIC, // STREAM_MUSIC
AudioSystem.STREAM_ALARM, // STREAM_ALARM
//modify (start)
//AudioSystem.STREAM_RING, // STREAM_NOTIFICATION
AudioSystem.STREAM_NOTIFICATION, // STREAM_NOTIFICATION
//modify (end)
AudioSystem.STREAM_BLUETOOTH_SCO, // STREAM_BLUETOOTH_SCO
AudioSystem.STREAM_RING, // STREAM_SYSTEM_ENFORCED
AudioSystem.STREAM_RING, // STREAM_DTMF
AudioSystem.STREAM_MUSIC // STREAM_TTS
}
private final int[] STREAM_VOLUME_ALIAS_DEFAULT = new int[] {
AudioSystem.STREAM_VOICE_CALL, // STREAM_VOICE_CALL
AudioSystem.STREAM_RING, // STREAM_SYSTEM
AudioSystem.STREAM_RING, // STREAM_RING
AudioSystem.STREAM_MUSIC, // STREAM_MUSIC
AudioSystem.STREAM_ALARM, // STREAM_ALARM
//modify (start)
//AudioSystem.STREAM_RING, // STREAM_NOTIFICATION
AudioSystem.STREAM_NOTIFICATION, // STREAM_NOTIFICATION
//modify (end)
AudioSystem.STREAM_BLUETOOTH_SCO, // STREAM_BLUETOOTH_SCO
AudioSystem.STREAM_RING, // STREAM_SYSTEM_ENFORCED
AudioSystem.STREAM_RING, // STREAM_DTMF
AudioSystem.STREAM_MUSIC // STREAM_TTS
}
以上在//modify 的地方做出修改,将原本STREAM_NOTIFICATION对应的AudioSystem.STREAM_RING修改成AudioSystem.STREAM_NOTIFICATION,AudioService.java是控制着所有音频的.AudioSystem是上层与底层的传音者.
(2)然后在frameworks/base/core/java/android/preference/SeekBarVolumizer.java
找到private static boolean isNotificationOrRing(int stream) {
//modify start
//return stream == AudioManager.STREAM_RING || stream == AudioManager.STREAM_NOTIFICATION;
return stream == AudioManager.STREAM_RING;
//modify end
}
SeekBarVolumizer.java就是控制着进度条的显示的,在这里将铃声音量与通知音量解绑.
(3) 在packages/apps/Settings/src/com/android/settings/notification/SoundSettings.java
定位到:public void onCreate(Bundle savedInstanceState) {
//modify start
//start modify notification volume
/*if (mVoiceCapable) {
mRingOrNotificationPreference =
initVolumePreference(KEY_RING_VOLUME, AudioManager.STREAM_RING,
com.android.internal.R.drawable.ic_audio_ring_notif_mute);
removePreference(KEY_NOTIFICATION_VOLUME);
} else {
mRingOrNotificationPreference =
initVolumePreference(KEY_NOTIFICATION_VOLUME, AudioManager.STREAM_NOTIFICATION,
com.android.internal.R.drawable.ic_audio_ring_notif_mute);
removePreference(KEY_RING_VOLUME);
} */
initVolumePreference(KEY_NOTIFICATION_VOLUME, AudioManager.STREAM_NOTIFICATION,
com.android.internal.R.drawable.ic_audio_notification_mute);
if (mVoiceCapable) {
mRingOrNotificationPreference = initVolumePreference(KEY_RING_VOLUME, AudioManager.STREAM_RING,
com.android.internal.R.drawable.ic_audio_ring_notif_mute);
} else {
removePreference(KEY_RING_VOLUME);
}
//end modify notification volume
//modify end
}
上面是进入设置里面添加一条通知音量的进度条显示,SoundSettings.java里面的修改只是控制设置-声音与震动里面的界面显示而已,功能的分离控制是在frameworks里面.
setting里与之相应的布局在packages/apps/Settings/res/xml/sound_settings.xml里,这里也要做相应的修改,只是改一个图标:找到标签更改一下图标即可,图标一般用
ic_audio_notification ,在frameworks\base\core\res\res\drawable-hdpi里面可以找到.
(4)/frameworks/base/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
找到if (mRows.isEmpty()) {
addRow(AudioManager.STREAM_RING,
R.drawable.ic_volume_ringer, R.drawable.ic_volume_ringer_mute, true);
//add start
addRow(AudioManager.STREAM_NOTIFICATION,
R.drawable.ic_audio_notification_am_alpha, R.drawable.ic_audio_notification_mute_am_alpha, true);
//add end
addRow(AudioManager.STREAM_MUSIC,
R.drawable.ic_volume_media, R.drawable.ic_volume_media_mute, true);
addRow(AudioManager.STREAM_ALARM,
R.drawable.ic_volume_alarm, R.drawable.ic_volume_alarm_mute, false);
addRow(AudioManager.STREAM_VOICE_CALL,
R.drawable.ic_volume_voice, R.drawable.ic_volume_voice, false);
addRow(AudioManager.STREAM_BLUETOOTH_SCO,
R.drawable.ic_volume_bt_sco, R.drawable.ic_volume_bt_sco, false);
addRow(AudioManager.STREAM_SYSTEM,
R.drawable.ic_volume_system, R.drawable.ic_volume_system_mute, false);
这是在SystemUI里面添加一条新的音量调节进度条,这也是界面部分
综上,分离铃声音量与通知音量的 功能分离是在AudioService里面和Frameworks里的SeekBarVolumizer里面,界面上的话还要自己添加一条音量进度条即可.

阅读全文
0 0
原创粉丝点击