基于Android P 截屏流程

本文探讨了在Android P系统中如何实现截屏功能,主要聚焦于电源键+音量键截屏的方式。Android Framework层的PhoneWindowManager.java文件处理了包括电源键在内的各种按键事件,以此来触发截屏流程。
摘要由CSDN通过智能技术生成

截屏功能是大家经常用到的一项功能,使用截屏功能能便捷且快速地把手机当前屏幕显示的信息以图片的形式存储到手机中。

截屏操作一般有两种途径:

  1. 下拉手机屏幕上方状态栏点击快捷功能面板中的截屏(部分手机品牌中支持此功能)。
  2. 同时按住手机侧方的电源键+音量减键来实现截屏。

这两种截屏的方式其根本原理是一样的,实现的流程都是一样的,不同的是触发方式。

一、截屏

a. 电源键+音量键截屏

         Android 系统中对各类物理与虚拟按键的处理都是在 Framework 层中的 PhoneWindowManager.java 内实现。

  1. 对电源键的监听处理
    /frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
    @Override
    public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
    …
    case KeyEvent.KEYCODE_POWER: {//匹配电源键
         // Any activity on the power button stops the accessibility shortcut
    cancelPendingAccessibilityShortcutAction();
         result &= ~ACTION_PASS_TO_USER;
    isWakeKey = false; // wake-up will be handled separately
         if (down) {//当电源键被按下状态时
    interceptPowerKeyDown(event, interactive);
          } else {
    interceptPowerKeyUp(event, interactive, canceled);
          }
          break;
    }
    …
    }
    private void interceptPowerKeyDown(KeyEvent event, boolean interactive) {
      .... 
     // Latch power key state to detect screenshot chord.
            if (interactive && !mScreenshotChordPowerKeyTriggered
    && (event.getFlags() &KeyEvent.FLAG_FALLBACK) == 0) {
    mScreenshotChordPowerKeyTriggered = true;              //Power 键被触发的标示符
    mScreenshotChordPowerKeyTime = event.getDownTime();   //获取 Power 键的触发时间
    interceptScreenshotChord();
            }
    }
    private void interceptScreenshotChord() {
            if (mScreenshotChordEnabled  //系统是否开启截屏功能
    &&mScreenshotChordVolumeDownKeyTriggered  //音量减键已被按下
    &&mScreenshotChordPowerKeyTriggered  //电源减键已被按下
    && !mA11yShortcutChordVolumeUpKeyTriggered) { //音量减键未被按下
                   final long now = SystemClock.uptimeMillis();  //获取当前的时间
                    //当前时间要小于或等于音量减键被按下时间+150S
                   if (now < = mScreenshotChordVolumeDownKeyTime + SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS  
    // 当前时间要小于或等于电源键被按下时间+150S                                            
    && now < = mScreenshotChordPowerKeyTime + SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS) {   
    mScreenshotChordVolumeDownKeyConsumed = true;
    cancelPendingPowerKeyAction();
                    mScreenshotRunnable.setScreenshotType(TAKE_SCREENSHOT_FULLSCREEN);
    	mHandler.postDelayed(mScreenshotRunnable, getScreenshotChordLongPressDelay());
                }
            }
    }
    //截屏是有两种模式,一种是全屏截屏,另一种是区域截屏。默认是全屏截屏
    private class ScreenshotRunnable implements Runnable {
            private int mScreenshotType = TAKE_SCREENSHOT_FULLSCREEN;//默认截屏方式是全屏截取
            public void setScreenshotType(int screenshotType) {
    mScreenshotType = screenshotType;
            }
            @Override
            public void run() {
    	takeScreenshot(mScreenshotType)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值