宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

RK3368 Android6.0

今天 12.31 有点搞笑 有测试人员反馈 短按power键 会跳转到camera2  

先看了一下日志 确实跳转到了camera2  把东西捋了一下 问了一下 硬件一度怀疑power的键值是不是改变了) 硬件说要拿烙铁帮我看一下日志 哈哈哈

一.日志先上

12-31 15:06:45.716  GestureLauncherService  586): Power button double tap gesture detected, launching camera. Interval=240ms  噫

12-31 15:06:45.959  ActivityManager  586): START u0 {act=android.media.action.STILL_IMAGE_CAMERA

12-31 15:06:45.476 W/TelecomManager  586): Telecom Service not found.
12-31 15:06:45.624 D/XHApiManager  586): enter XHApiManager
12-31 15:06:45.625 I/PowerManagerService  586): Going to sleep due to power button uid 1000)...
12-31 15:06:45.627 I/PowerManagerService  586): Sleeping uid 1000)...
12-31 15:06:45.715 D/XHApiManager  586): enter XHApiManager
12-31 15:06:45.716 W/TelecomManager  586): Telecom Service not found.
12-31 15:06:45.716 I/GestureLauncherService  586): Power button double tap gesture detected, launching camera. Interval=240ms
12-31 15:06:45.717 I/PowerManagerService  586): Waking up from sleep uid 1000)...
12-31 15:06:45.733 D/SensorsHal  586): Couldn't open /dev/mma8452_daemon No such file or directory)
12-31 15:06:45.733 E/SensorService  586): Error activating sensor 0 Operation not permitted)
12-31 15:06:45.734 V/KeyguardServiceDelegate  586): onStartedWakingUp)
12-31 15:06:45.749 D/WifiConfigStore  586): Retrieve network priorities before PNO. Max priority: 0
12-31 15:06:45.751 D/XHService  586): receiver intent :android.intent.action.SCREEN_OFF
12-31 15:06:45.751 E/WifiStateMachine  586):  Fail to set up pno, want true now false
12-31 15:06:45.776 E/native    586): do suspend true
12-31 15:06:45.779 I/ActivityManager  586): START u0 {act=android.media.action.STILL_IMAGE_CAMERA flg=0x14000000 cmp=com.android.camera2/com.android.camera.CameraActivity} from uid 10011 on display 0 

1.1.frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java

power键值

            case KeyEvent.KEYCODE_POWER: {
                result &= ~ACTION_PASS_TO_USER;
                isWakeKey = false; // wake-up will be handled separately
                if down) {
                    interceptPowerKeyDownevent, interactive);				      					 					
                } else {
                    interceptPowerKeyUpevent, interactive, canceled);
                }
                break;

 power键按下

    private void interceptPowerKeyDownKeyEvent event, boolean interactive) {
        // Hold a wake lock until the power key is released.
        if !mPowerKeyWakeLock.isHeld)) {
            mPowerKeyWakeLock.acquire);
        }

        // Cancel multi-press detection timeout.
        if mPowerKeyPressCounter != 0) {
            mHandler.removeMessagesMSG_POWER_DELAYED_PRESS);
        }

        // Detect user pressing the power button in panic when an application has
        // taken over the whole screen.
        boolean panic = mImmersiveModeConfirmation.onPowerKeyDowninteractive,
                SystemClock.elapsedRealtime), isImmersiveModemLastSystemUiFlags));
        if panic) {
            mHandler.postmHiddenNavPanic);
        }

        // Latch power key state to detect screenshot chord.
        if interactive && !mScreenshotChordPowerKeyTriggered
                && event.getFlags) & KeyEvent.FLAG_FALLBACK) == 0) {
            mScreenshotChordPowerKeyTriggered = true;
            mScreenshotChordPowerKeyTime = event.getDownTime);
            interceptScreenshotChord);
        }

        // Stop ringing or end call if configured to do so when power is pressed.
        TelecomManager telecomManager = getTelecommService);
        boolean hungUp = false;
        if telecomManager != null) {
            if telecomManager.isRinging)) {
                // Pressing Power while there's a ringing incoming
                // call should silence the ringer.
                telecomManager.silenceRinger);
            } else if mIncallPowerBehavior
                    & Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_HANGUP) != 0
                    && telecomManager.isInCall) && interactive) {
                // Otherwise, if "Power button ends call" is enabled,
                // the Power button will hang up any current active call.
                hungUp = telecomManager.endCall);
            }
        }

        GestureLauncherService gestureService = LocalServices.getService
                GestureLauncherService.class);
        boolean gesturedServiceIntercepted = false;
        if gestureService != null) {
            gesturedServiceIntercepted = gestureService.interceptPowerKeyDownevent, interactive);
        }

        // If the power key has still not yet been handled, then detect short
        // press, long press, or multi press and decide what to do.
        mPowerKeyHandled = hungUp || mScreenshotChordVolumeDownKeyTriggered
                || mScreenshotChordVolumeUpKeyTriggered || gesturedServiceIntercepted;
        if !mPowerKeyHandled) {
            if interactive) {
                // When interactive, we're already awake.
                // Wait for a long press or for the button to be released to decide what to do.
                if hasLongPressOnPowerBehavior)) {
                    Message msg = mHandler.obtainMessageMSG_POWER_LONG_PRESS);
                    msg.setAsynchronoustrue);
                    mHandler.sendMessageDelayedmsg,
                            ViewConfiguration.getmContext).getDeviceGlobalActionKeyTimeout));
                }
            } else {
                wakeUpFromPowerKeyevent.getDownTime));

                if mSupportLongPressPowerWhenNonInteractive && hasLongPressOnPowerBehavior)) {
                    Message msg = mHandler.obtainMessageMSG_POWER_LONG_PRESS);
                    msg.setAsynchronoustrue);
                    mHandler.sendMessageDelayedmsg,
                            ViewConfiguration.getmContext).getDeviceGlobalActionKeyTimeout));
                    mBeganFromNonInteractive = true;
                } else {
                    final int maxCount = getMaxMultiPressPowerCount);

                    if maxCount <= 1) {
                        mPowerKeyHandled = true;
                    } else {
                        mBeganFromNonInteractive = true;
                    }
                }
            }
        }
    } 

1.2.frameworks\base\services\core\java\com\android\server\GestureLauncherService.java

双击拉起camera2        mCameraDoubleTapPowerEnabled && 判断距离上一次按键时间 

mCameraDoubleTapPowerEnabled ->isCameraDoubleTapPowerSettingEnabled->Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED

updateCameraDoubleTapPowerEnabled

    private void updateCameraDoubleTapPowerEnabled) {
        boolean enabled = isCameraDoubleTapPowerSettingEnabledmContext, mUserId);
        synchronized this) {
            mCameraDoubleTapPowerEnabled = enabled;
        

isCameraDoubleTapPowerSettingEnabled   

    public static boolean isCameraDoubleTapPowerSettingEnabledContext context, int userId) {
        return isCameraDoubleTapPowerEnabledcontext.getResources))
                && Settings.Secure.getIntForUsercontext.getContentResolver),
                        Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 0, userId) == 0);
    }

interceptPowerKeyDown  

    public boolean interceptPowerKeyDownKeyEvent event, boolean interactive) {
        boolean launched = false;
        boolean intercept = false;
        long doubleTapInterval;
        synchronized this) {
            doubleTapInterval = event.getEventTime) - mLastPowerDown;
            if mCameraDoubleTapPowerEnabled
                    && doubleTapInterval < CAMERA_POWER_DOUBLE_TAP_MAX_TIME_MS
                    && doubleTapInterval > CAMERA_POWER_DOUBLE_TAP_MIN_TIME_MS) {
                launched = true;
                intercept = interactive;
            }
            mLastPowerDown = event.getEventTime);
        }
        if launched) {
            Slog.iTAG, "Power button double tap gesture detected, launching camera. Interval="
                    + doubleTapInterval + "ms");
            launched = handleCameraLaunchGesturefalse /* useWakelock */,
                    StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP);
            if launched) {
                MetricsLogger.actionmContext, MetricsLogger.ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE,
                        int) doubleTapInterval);
            }
        }
        MetricsLogger.histogrammContext, "power_double_tap_interval", int) doubleTapInterval);
        return intercept && launched;
    }

handleCameraGesture 拉起相机

    /**
     * @return true if camera was launched, false otherwise.
     */
    private boolean handleCameraLaunchGestureboolean useWakelock, int source) {
        boolean userSetupComplete = Settings.Secure.getIntmContext.getContentResolver),
                Settings.Secure.USER_SETUP_COMPLETE, 0) != 0;
        if !userSetupComplete) {
            if DBG) Slog.dTAG, String.format
                    "userSetupComplete = %s, ignoring camera launch gesture.",
                    userSetupComplete));
            return false;
        }
        if DBG) Slog.dTAG, String.format
                "userSetupComplete = %s, performing camera launch gesture.",
                userSetupComplete));

        if useWakelock) {
            // Make sure we don't sleep too early
            mWakeLock.acquire500L);
        }
        StatusBarManagerInternal service = LocalServices.getService
                StatusBarManagerInternal.class);
        service.onCameraLaunchGestureDetectedsource);
        return true;
    }