內容如下:
key 399 GRAVE key 2 1 key 3 2 key 4 3 key 5 4 key 6 5 key 7 6 key 8 7 key 9 8 key 10 9 key 11 0 key 158 BACK WAKE_DROPPED key 230 SOFT_RIGHT WAKE key 60 SOFT_RIGHT WAKE key 107 ENDCALL WAKE_DROPPED key 62 ENDCALL WAKE_DROPPED key 229 MENU WAKE_DROPPED key 139 MENU WAKE_DROPPED key 59 MENU WAKE_DROPPED key 127 SEARCH WAKE_DROPPED key 217 SEARCH WAKE_DROPPED key 228 POUND key 227 STAR key 231 CALL WAKE_DROPPED key 61 CALL WAKE_DROPPED key 232 DPAD_CENTER WAKE_DROPPED key 108 DPAD_DOWN WAKE_DROPPED key 103 DPAD_UP WAKE_DROPPED key 102 HOME WAKE key 105 DPAD_LEFT WAKE_DROPPED key 106 DPAD_RIGHT WAKE_DROPPED key 115 VOLUME_UP key 114 VOLUME_DOWN key 116 POWER WAKE key 212 CAMERA .... key 16 Q key 17 W key 18 E key 19 R key 20 T key 21 Y key 22 U key 23 I key 24 O key 25 P key 26 LEFT_BRACKET key 27 RIGHT_BRACKET key 43 BACKSLASH
首先將CAMERA改成
key 212 CAMERA WAKE_DROPPED
並重開機,但神奇的是進了suspend之後按下CAMERA卻沒有wake up,但kernel卻有resume...
原來在 frameworks/policies/base/phone/com/android/internal/policy/impl/KeyguardViewMediator.java 有一段code,frameworks會阻擋特定key不亮螢幕,並在背景執行該key的動作。
/** * When a key is received when the screen is off and the keyguard is showing, * we need to decide whether to actually turn on the screen, and if so, tell * the keyguard to prepare itself and poke the wake lock when it is ready. * * The 'Tq' suffix is per the documentation in {@link WindowManagerPolicy}. * Be sure not to take any action that takes a long time; any significant * action should be posted to a handler. * * @param keyCode The keycode of the key that woke the device * @return Whether we poked the wake lock (and turned the screen on) */ public boolean onWakeKeyWhenKeyguardShowingTq(int keyCode) { if (DEBUG) Log.d(TAG, "onWakeKeyWhenKeyguardShowing(" + keyCode + ")"); if (isWakeKeyWhenKeyguardShowing(keyCode)) { // give the keyguard view manager a chance to adjust the state of the // keyguard based on the key that woke the device before poking // the wake lock wakeWhenReadyLocked(keyCode); return true; } else { return false; } } private boolean isWakeKeyWhenKeyguardShowing(int keyCode) { switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: case KeyEvent.KEYCODE_VOLUME_DOWN: case KeyEvent.KEYCODE_MUTE: case KeyEvent.KEYCODE_HEADSETHOOK: case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: case KeyEvent.KEYCODE_MEDIA_STOP: case KeyEvent.KEYCODE_MEDIA_NEXT: case KeyEvent.KEYCODE_MEDIA_PREVIOUS: case KeyEvent.KEYCODE_MEDIA_REWIND: case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: case KeyEvent.KEYCODE_CAMERA: return false; } return true; }
從isWakeKeyWhenKeyguardShowing &onWakeKeyWhenKeyguardShowingTq 可知道符合特定key將不會被wake up。
沒有留言:
張貼留言