Android4.0 源码-Screenshot 截屏流程分析

当按下特定组合键时,Android 4.0 的截屏流程从 PhoneWindowManager.java 开始,通过 interceptScreenshotChord() 方法触发 takeScreenshot()。在 GlobalScreenshot.java 中,截图操作完成并显示动画。截图图片的存储位置在同个类的处理中,同时也涉及到 Environment 成员。详细分析可参考相关博客文章。
摘要由CSDN通过智能技术生成


LOG: I/ActivityManager(  195): Start proc com.android.systemui:screenshot for service com.android.systemui/.screenshot.TakeScreenshotServ}

1)  按下组合键,进如PhoneWindowManager.java (/framework/base/policy/src/com/android/internal/policy/impl )

 public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn) {
        final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
        final boolean canceled = event.isCanceled();
        final int keyCode = event.getKeyCode();
        ....

       switch (keyCode) {
           ....
                if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
                    if (down) {
                        if (isScreenOn && !mVolumeDownKeyTriggered
                                && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
                            mVolumeDownKeyTriggered = true;
                            mVolumeDownKeyTime = event.getDownTime();
                            mVolumeDownKeyConsumedByScreenshotChord = false;
                            cancelPendingPowerKeyAction();
                            interceptScreenshotChord();
                      Slog.d(TAG,"[Paul]interceptKeyBeforeQueueing.........Call  interceptScreenshotChord().... 1 "); //按组合键之后先到这 
                        }
                    } else {
                        mVolumeDownKeyTriggered = false;
                        cancelPendingScreenshotChordAction();
                     Slog.d(TAG,"[Paul]interceptKeyBeforeQueueing.........Call cancelPendingScreenshotChordAction().... 2 "); //按键放手到这
            
                    }
                } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
                       .... 

 }

2)Call interceptScreenshotChord() 方法;


 private void cancelPendingPowerKeyAction() {
        if (!mPowerKeyHandled) {
            mHandler.removeCallbacks(mPowerLongPress);
        }
        if (mPowerKeyTriggered) {
            mPendingPowerKeyUpCanceled = true;
                      Slog.d(TAG,"[Paul]cancelPendingPowerKeyAction...........5 "); //paul
        }
    }

    private void interceptScreenshotChord() {
        if (mVolumeDownKeyTriggered && mPowerKeyTriggered && !mVolumeUpKeyTriggered) {
            final long now = SystemClock.uptimeMillis();
            if (now <= mVolumeDownKeyTime + SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS
                    && now <= mPowerKeyTime + SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS) {
                mVolumeDownKeyConsumedByScreenshotChord = true;
                cancelPendingPowerKeyAction();
                      Slog.d(TAG,"[Paul]interceptScreenshotChord...........6 "); //paul
                mHandler.postDelayed(mScreenshotChordLongPress,
                        ViewConfiguration.getGlobalActionKeyTimeout());
            }
        }
    }

3)运行takeScreenshot() 方法:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值