音量下键和电源键截屏心得记录

2019-07-13 22:58发布

按键先在PhoneWindowManager.java处理。 音量键: case KeyEvent.KEYCODE_VOLUME_DOWN: case KeyEvent.KEYCODE_VOLUME_UP: case KeyEvent.KEYCODE_VOLUME_MUTE: { if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { if (down) { if (interactive && !mScreenshotChordVolumeDownKeyTriggered && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) { mScreenshotChordVolumeDownKeyTriggered = true; mScreenshotChordVolumeDownKeyTime = event.getDownTime(); mScreenshotChordVolumeDownKeyConsumed = false; cancelPendingPowerKeyAction(); interceptScreenshotChord(); } } else { mScreenshotChordVolumeDownKeyTriggered = false; cancelPendingScreenshotChordAction(); } }
power键: if (interactive && !mScreenshotChordPowerKeyTriggered && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) { mScreenshotChordPowerKeyTriggered = true; mScreenshotChordPowerKeyTime = event.getDownTime(); interceptScreenshotChord(); }其中 interceptScreenshotChord();就是控制截屏的代码 private void interceptScreenshotChord() { if (mScreenshotChordEnabled && mScreenshotChordVolumeDownKeyTriggered && mScreenshotChordPowerKeyTriggered && !mScreenshotChordVolumeUpKeyTriggered) { final long now = SystemClock.uptimeMillis(); if (now <= mScreenshotChordVolumeDownKeyTime + SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS && now <= mScreenshotChordPowerKeyTime + SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS) { mScreenshotChordVolumeDownKeyConsumed = true; cancelPendingPowerKeyAction(); mHandler.postDelayed(mScreenshotRunnable, getScreenshotChordLongPressDelay()); } } } 为了防止截屏的时候音量下键生效出现调节音量的dialog,有 if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN && mScreenshotChordVolumeDownKeyConsumed) { if (!down) { mScreenshotChordVolumeDownKeyConsumed = false; } return -1; }

以上是源码,如果要将组合键改为power键和home键: 在监听到home键的地方加:
if (isScreenOn() && !mBackBtnDownKeyTriggered && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) { mBackBtnDownKeyTriggered = true; mBackkeyTime = event.getDownTime(); mBackDownKeyConsumedByScreenshotChord = false; cancelPendingPowerKeyAction(); interceptScreenshotChord(); } }interceptScreenshotChord();里面的方法改为: if (mBackBtnDownKeyTriggered && mScreenshotChordPowerKeyTriggered ) { final long now = SystemClock.uptimeMillis(); //android.util.Log.i("cenon","interceptScreenshotChord mBackkeyTime="+mBackkeyTime+" now="+now+" mScreenshotChordPowerKeyTime="+mScreenshotChordPowerKeyTime); if (now <= mBackkeyTime+ SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS && now <= mScreenshotChordPowerKeyTime + SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS) { //android.util.Log.i("cenon","mScreenshotRunnable post"); mBackDownKeyConsumedByScreenshotChord = true; cancelPendingPowerKeyAction(); mHandler.postDelayed(mScreenshotRunnable, ViewConfiguration.getGlobalActionKeyTimeout()); } }为了防止截屏的时候音量下键生效出现调节音量的dialog,添加: if (keyCode == KeyEvent.KEYCODE_HOME && mBackDownKeyConsumedByScreenshotChord && android.provider.Settings.System.getInt(mContext.getContentResolver(), "home_button_layout_flag", 0) == 0) {//modified by wangyouyou if (!down) { mBackDownKeyConsumedByScreenshotChord = false; } return -1; } 其实就是仿造源码写,当然抬手的时候要将相应的boolen值改为false
注:对音量键的控制实际在PhoneWindow.java protected boolean onKeyUp(int featureId, int keyCode, KeyEvent event) { final KeyEvent.DispatcherState dispatcher = mDecor != null ? mDecor.getKeyDispatcherState() : null; if (dispatcher != null) { dispatcher.handleUpEvent(event); } //Log.i(TAG, "Key up: repeat=" + event.getRepeatCount() // + " flags=0x" + Integer.toHexString(event.getFlags())); switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: case KeyEvent.KEYCODE_VOLUME_DOWN: { final int flags = /*AudioManager.FLAG_PLAY_SOUND |*/ AudioManager.FLAG_VIBRATE // delete by csc | AudioManager.FLAG_FROM_KEY; // If we have a session send it the volume command, otherwise // use the suggested stream. if (mMediaController != null) { mMediaController.adjustVolume(0, flags); } else { MediaSessionLegacyHelper.getHelper(getContext()).sendAdjustVolumeBy( mVolumeControlStreamType, 0, flags); } return true; } case KeyEvent.KEYCODE_VOLUME_MUTE: { // Similar code is in PhoneFallbackEventHandler in case the window // doesn't have one of these. In this case, we execute it here and // eat the event instead, because we have mVolumeControlStreamType // and they don't. getAudioManager().handleKeyUp(event, mVolumeControlStreamType); return true; }