`
小骏向前冲
  • 浏览: 18334 次
社区版块
存档分类
最新评论

power键和音量键组合实现截图功能

阅读更多
   今天看源码的时候看到一个使用power键和音量下键来组合实现屏幕截图的功能,还挺有趣的,之前一直都不知道。。。
   废话不多说,直接看过程吧
   在android中由WindowManagerService这个系统服务来循环读取窗口获取的消息(包括按下,弹起,双击,单击等)然后分发到各个类接收,在这个过程中有一个类会进行消息过滤处理,就是PhoneWindowManager了,PhoneWindowManager中有两个方法interceptKeyBeforeDispatching和interceptKeyBeforeQueueing,其中包括了几乎所有按键的处理,interceptKeyBeforeDispatching主要处理Home键、Menu键、Search键等,
interceptKeyBeforeQueueing主要处理音量键、电源键、耳机键等。
截屏功能的代码就是在interceptKeyBeforeQueueing方法中,看两段代码
case KeyEvent.KEYCODE_VOLUME_DOWN:
            case KeyEvent.KEYCODE_VOLUME_UP:
            case KeyEvent.KEYCODE_VOLUME_MUTE: {
                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();
                        }
                    } else {
                        mVolumeDownKeyTriggered = false;
                        cancelPendingScreenshotChordAction();
                    }
......


case KeyEvent.KEYCODE_POWER: {
                result &= ~ACTION_PASS_TO_USER;
                if (down) {
                    if (isScreenOn && !mPowerKeyTriggered
                            && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
                        mPowerKeyTriggered = true;
                        mPowerKeyTime = event.getDownTime();
                        interceptScreenshotChord();
                    }
......


可以看到正是这里(响应down事件)捕获是否按了音量下键和电源键,而且两个地方都会进入函数interceptScreenshotChord()中,接下来看看这个函数做了什么操作:

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();

                mHandler.postDelayed(mScreenshotChordLongPress,
                        ViewConfiguration.getGlobalActionKeyTimeout());
            }
        }
}


在这个函数中,用两个布尔变量判断是否同时按了音量下键和电源键后,再计算两个按键响应Down事件之间的时间差不超过150毫秒,也就认为是同时按了这两个键后,算是真正的捕获到屏幕截屏的组合键。

调用函数interceptScreenshotChord,
private void interceptScreenshotChord() {
        if (mScreenshotChordEnabled
                && 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();
                mHandler.postDelayed(mScreenshotChordLongPress, getScreenshotChordLongPressDelay());
            }
        }
    }


发送消息mScreenshotChordLongPress到消息队列里面,点进去可以看到
private final Runnable mScreenshotChordLongPress = new Runnable() {
        public void run() {
            takeScreenshot();
        }
    };


这个takeScreenshot一看就知道是实现截图功能的函数了,在takeScreenshot里面主要是绑定一个TakeScreenshotService的服务,还有一些返回的消息处理,再往下就是涉及到JNI调用底层服务的东西,在这就不作介绍了,也没仔细研究过 
0
0
分享到:
评论

相关推荐

    海信eg900音量键向下锁屏

    【海信EG900音量键向下锁屏】是一个针对海信EG900智能手机的自定义设置,主要是通过修改系统文件来实现用音量键替代电源键进行设备的唤醒和锁屏操作。这个功能对于一些用户来说可能是非常实用的,特别是那些习惯于用...

    按下功能键关机.rar

    最后,关于压缩包“按下功能键关机.rar”,这可能包含了一份详细的指南、软件程序或者系统设置教程,教用户如何配置或使用特定的功能键组合来实现快速关机。由于没有实际文件内容,我们无法提供更具体的细节。但用户...

    华硕笔记本键盘解析

    总的来说,华硕笔记本键盘的设计考虑到了用户的多种需求,无论是日常工作中的数据输入,还是多媒体娱乐,甚至一些高级功能如系统性能调整,都可以通过Fn键的组合轻松实现。了解并熟练运用这些功能,不仅能够提升工作...

    笔记本电脑的Fn键.doc

    Fn键与其他键组合使用时,能够激活笔记本电脑上的一些特殊功能,这些功能通常是为了节省空间而设计,因为笔记本键盘比台式机键盘紧凑。每个品牌的笔记本电脑Fn键的组合方式可能会有所不同,下面我们将详细解析几个...

    索尼eb系列 fn键恢复(重装系统)

    FN键是许多笔记本电脑上特有的功能键,它与其他F1至F12键结合使用,可以实现诸如调节音量、控制无线网络等快捷操作。本文将详细讲解如何在重装系统后恢复索尼EB系列笔记本电脑的FN键功能。 首先,我们要理解FN键的...

    Android应用源码之按键的处理.zip

    Android系统支持两种主要的按键事件类型:物理按键(如设备上的电源键、音量键)和触摸屏事件(如点击、滑动)。开发者可以使用不同的方法来处理这些事件,以实现各种定制化的功能。 1. **物理按键处理**: - **...

    KN-Q10SHUOMS

    由于其物理尺寸的约束,该设备的面板并未配置大量按键和旋钮,而是通过菜单组合操作的方式来实现各种功能。用户在使用前必须详细阅读说明书,特别是关于菜单操作的部分,以确保能正确有效地使用设备。 设备的操作...

    Android 截图功能源码的分析

    当用户按下音量减小键和电源键(通常用于截图)时,这些按键事件首先会被Android系统的输入子系统捕获。在Android的`PhoneWindowManager`类中,`dispatchUnhandledKey`方法是处理未被应用程序处理的按键事件的关键...

    Monkeyrunner 常用按键总结

    9. 上音量键:KEYCODE_VOLUME_UP 和 下音量键:KEYCODE_VOLUME_DOWN - 这两个键分别用于增大和减小音量。在Monkeyrunner中,你可以使用它们来调整设备的音量。 10. Power键:KEYCODE_POWER - 这个键用于开关机或...

    ASUS 华硕 EeePC 热键驱动

    热键,也称为快捷键或功能键,允许用户通过简单的键盘组合来执行特定的操作,比如调节音量、开关无线网络、启用或禁用蓝牙等功能。这些功能极大地提高了用户的工作效率和便捷性。 首先,让我们来了解什么是热键驱动...

    建伍th-f7e中文操作说明

    5. **功能键组合操作**(按F键后再按其他键): - **F+LOW=BATT**:显示电池电量。 - **F+BAND=MODE**:接收模式转换。 - **F+DUAL=DUAL**:单双工显示。 - **F+INFO=VISUAL**:接收状态强度显示。 - **F+SQL=...

    昭阳K4350信息资料.docx

    13. **功能组合键**:通过Fn键与F1至F12键的组合,可以实现如键盘灯控制、睡眠模式、屏幕亮度调整、音量控制、无线网络开关、摄像头启用/禁用、触摸板开启/关闭等功能。 14. **部件信息**:I/O板包含了左侧的VGA、...

    数字对讲机专业术语 包括VOX CTCSS.....

    音频指的是对讲机的声音质量,通常指声音的清晰度和音量。音频范围一般为300Hz到3400Hz,这涵盖了人声的主要频率范围。 以上这些专业术语涵盖了数字对讲机的核心技术和功能特性,对于理解和使用这类设备至关重要。...

    ThinkVantage Win7 主题

    6. **Hotkeys**:ThinkPad的特殊热键功能,如Fn键组合,可以快速访问系统设置、音量控制、屏幕亮度调整等。 这个"ThinkVantage Win7 主题"可能将这些工具的图标、启动画面以及系统界面设计成与ThinkPad品牌风格相...

    宏基常用快捷键

    “Acer Settings”主要用于调整硬件配置如显示器亮度、音量等,“Acer Manager”则提供了更多高级管理和诊断工具。 - **&lt;Fn&gt;+**:打开或切换到“Acer Power Management”或“Acer Manager”。与上述类似,“Acer ...

    凌波多媒体电子教室

    采用音频混合技术,支持多人同时用语音进行交谈,结合任意分组功能,凌波多媒体电子教室软件可以实现功能强劲的语音教室; 支持各种格式的视频和音频素材的跟读、复读功能令用户尽享英语教学的华丽听觉。使多媒体...

    调音台常用英文缩写翻译.docx

    - **定义**:GAIN(增益)键用于控制输入信号的初始电平大小,是调音台最基本也是最重要的功能之一。 - **作用**:通过调整GAIN旋钮可以设置每个通道信号进入调音台时的初始强度,确保信号既不过弱也不过强,为后续...

    电脑高手必备 Windows系统35招实用技巧

    量到CD唱机、PC扬声器等单项输入输出的音量控制功能。你也可以通过选择 “静音”来关闭相应的单项音量。  (8)单击“音量”选项卡中的“扬声器设置”区域中的“高级”按钮后, 在弹出的“高级音频属性”对话框你...

    单片机元件名称中英文对照

    PLDs(可编程逻辑器件)和FPGAs(现场可编程门阵列)是可编程的集成电路,用于实现复杂逻辑功能,具有高度灵活性和可重构性。 ### Resistors 各种电阻 电阻器是一类用于限制电流、分压、滤波等的元件,包括固定...

Global site tag (gtag.js) - Google Analytics