按下音量的加减键,对应的keyevent是:KEYCODE_VOLUME_DOWN,KEYCODE_VOLUME_UP
主要看PhoneWindowManager对物理按键事件的处理
按键事件进入队列前的方法:interceptKeyBeforeQueueing ()
文件路径:frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
interceptKeyBeforeQueueing方法是按键事件放入队列前的按键事件拦截
在switch中找到下面三个类型的case
KeyEvent.KEYCODE_VOLUME_DOWN:音量减小键
KeyEvent.KEYCODE_VOLUME_UP:音量增加键
KeyEvent.KEYCODE_VOLUME_MUTE:扬声器静音键
在case的最后,对是否屏幕亮起进行判断,如果不是亮起,手动对音量进行干涉,使用sendVolumeKeyEvent方法进行设置。
sendVolumeKeyEvent(event) 的作用是将音量按键事件(KeyEvent)转发给当前活跃的 MediaSession
接下来的处理,就是通过MediaSessionManager,SessionManagerImpl(位于MediaSessionService.java中),把请求传到audioservice那边,让其进行音量调节
if(!isScreenOn()){
MediaSessionLegacyHelper.getHelper(mContext).sendVolumeKeyEvent(
event, AudioManager.USE_DEFAULT_STREAM_TYPE, false);
}
@Override
public boolean isScreenOn() {
return mDefaultDisplayPolicy.isScreenOnEarly();
}