安卓如何实现双击触摸唤醒点亮屏幕功能-Android framework实战开发

背景

经常有学员朋友在群里问到一个目前市场上常见的功能:
手机待机时候双击屏幕可以唤醒点亮手机屏幕功能
如何实现这个功能,经常有同学在群里求助,今天就刚好来讨论一下这个待机时候双击触摸唤醒点亮屏幕的功能的实现方案。

在这里插入图片描述

功能核心方案设计:

正常息屏待机时候,通过getevent是无法获取到任何的触摸事件,因为这个时候触摸屏驱动是没有工作,不会上报,需要息屏时候实现实现对触摸事件的输入,那么就需要考虑如何在息屏时候让触摸运行起来,这里一般可能会想到如下2个方案:

方案1、整体的息屏就是个假息屏,即息屏其实本质就是让背光关闭,但是触摸和画面等是可以正常使用,即这个息屏待机其实仅仅是背光关闭而已,但是系统app,触摸等都是正常运行的,只是没有背光看着屏幕息屏而已,这种其实整体功耗相比原来的息屏就会大很多。

方案2、息屏是正常的息屏,整体app画面也进入待机模式,不会在绘制画面等,背光也是关闭的,但是触摸驱动这个是上电的,可以识别用户的触摸事件,驱动层面识别双击后触发点亮屏幕。

下面针对2个方案进行尝试性调研

方案1可以直接framework层面修改

因为所有的power按键逻辑处理,都是需要经过PhoneWindowManager这里类进行的。所以考虑是否可以在PhoneWindowManager中对原有的power进行待机和唤醒操作进行修改。
核心思路步骤如下:

1.需要对power按键的原有息屏亮屏处理逻辑都进行屏蔽,即先让power按键按了之后没有任何反应

2.再针对power按键进行新的逻辑处理,只需要添加背光设置操作,息屏背光设置为0,亮屏恢复正常背光值

   public static  boolean isScreenLightOff = false;void setLightOff(){LightsManager lights = LocalServices.getService(LightsManager.class);LogicalLight mBacklight = lights.getLight(LightsManager.LIGHT_ID_BACKLIGHT);isScreenLightOff =true;mBacklight.setBrightness(0);}void setLightOn(){LightsManager lights = LocalServices.getService(LightsManager.class);LogicalLight mBacklight = lights.getLight(LightsManager.LIGHT_ID_BACKLIGHT);int brightness = Settings.System.getIntForUser(mContext.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS,mPowerManager.getDefaultScreenBrightnessSetting(),UserHandle.USER_CURRENT_OR_SELF);isScreenLightOff =false;mBacklight.setBrightness(brightness);}

3、需要对触摸事件进行的相关的识别,让触摸事件在背光为0状态不进行派发到任何的app,只是在InputDispatcherh中进识别双击,如果一旦双击则重新调用setLightOn,让屏幕点亮

该方案总结:
1、这个修改波及很大,修改了很多的原生逻辑,很多时候也有其他逻辑修改相关的背光情况,经常可能出现修改不全等情况
2、因为本质只是关闭了背光而已,所以整体app都还在正常运行,没有进入待机状态,所以整体功耗肯定比以前大很多

方案1缺点都比较致命,所以基本上完全不推荐该方案

方案2 驱动层面实现

这个方案属于大部分厂商都使用的现成方案,具体代码和实现细节暂时不进行深入,这里可拿相关手机来进调研看看是如何做到的。

1、有一个设置开关来启动双击亮屏功能
在这里插入图片描述
打开后既可以实现在灭屏时候点击触摸屏幕2下既可以点亮

2、在灭屏时候连续点击屏幕两下,通过getevent看看是不是传递的触摸事件?

test@test:~/disk2/nx563j_aosp14$ adb shell getevent -lrt
add device 1: /dev/input/event8name:     "msm8998-tasha-snd-card Button Jack"
add device 2: /dev/input/event7name:     "msm8998-tasha-snd-card Headset Jack"
add device 3: /dev/input/event6name:     "uinput-fpc"
add device 4: /dev/input/event1name:     "proximity"
add device 5: /dev/input/event2name:     "light"
add device 6: /dev/input/event0name:     "qpnp_pon"
add device 7: /dev/input/event3name:     "hall_device"
add device 8: /dev/input/event4name:     "nubia_synaptics_dsx"
add device 9: /dev/input/event5name:     "gpio-keys"
[  485422.726460] /dev/input/event4: EV_KEY       KEY_WAKEUP           DOWN                
[  485422.726460] /dev/input/event4: EV_SYN       SYN_REPORT           00000000            
[  485422.726758] /dev/input/event4: EV_KEY       KEY_WAKEUP           UP                  
[  485422.726758] /dev/input/event4: EV_SYN       SYN_REPORT           00000000             rate 3355
[  485422.791717] /dev/input/event1: EV_REL       REL_RZ               0000000a            
[  485422.791717] /dev/input/event1: EV_SYN       SYN_REPORT           00000000             rate 15
[  485422.878681] /dev/input/event1: EV_REL       REL_RZ               0000000a            
[  485422.878681] /dev/input/event1: EV_SYN       SYN_REPORT           00000000             rate 11

明显可以看出getevent获取的数据这里根本没出现有任何的触摸事件的abs数据,而是变成的KEY_WAKEUP的Key事件类型,从而达到唤醒屏幕的目的,这个KEY_WAKEUP就是和正常按下POWER按钮事件一样。
正常Power的getevent展示如下:


[  485662.684341] /dev/input/event0: EV_KEY       KEY_POWER            DOWN                
[  485662.684341] /dev/input/event0: EV_SYN       SYN_REPORT           00000000            
[  485662.801875] /dev/input/event1: EV_REL       REL_RZ               0000000a            
[  485662.801875] /dev/input/event1: EV_SYN       SYN_REPORT           00000000             rate 8
[  485662.827897] /dev/input/event0: EV_KEY       KEY_POWER            UP                  
[  485662.827897] /dev/input/event0: EV_SYN       SYN_REPORT           00000000             rate 38

KEY_WAKEUP和KEY_POWER的主要区别在于它们的功能和用途不同。‌

KEY_WAKEUP通常用于在设备休眠状态下通过特定按键唤醒设备,而KEY_POWER则用于控制设备的开关机功能。

KEY_WAKEUP是一个特定的按键值,用于在设备休眠时通过中断唤醒设备。当设备处于休眠状态时,通过按下具有唤醒功能的按键(如PowerKey),会触发中断,从而唤醒设备。这与设备的电源管理密切相关,允许用户在不完全关闭设备的情况下快速恢复使用‌12。

KEY_POWER则是指用于开关机的按键,通常在设备完全关闭时使用。按下KEY_POWER键会触发设备的关机或重启过程,这与设备的启动和关闭操作直接相关‌24。

在技术实现上,KEY_WAKEUP通常与设备的输入系统(如GPIO)相关联,并在设备休眠时设置为中断源。当按键被按下时,会触发中断,从而使设备从休眠状态唤醒。而KEY_POWER键的实现则涉及到更底层的硬件控制,确保设备能够执行开关机操作‌12。
即无论WAKEUP还是POWER都可以唤醒休眠点亮屏幕。
方案总结:
驱动层面实现方案为啥成为各个厂商主流方案,主要有以下几点:

1、完全不需要修改任何的framework层面代码,不需要修改破坏任何的原生power逻辑

2、驱动部分直接就识别了双击,然后上报的一个KEY_WAKEUP事件,非常简单的实现了唤醒设备

更多framework详细代码和资料参考如下链接
投屏专题部分:

https://mp.weixin.qq.com/s/IGm6VHMiAOPejC_H3N_SNg

hal+perfetto+surfaceflinger

https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
其他课程七件套专题:在这里插入图片描述
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

参考相关链接:
https://blog.csdn.net/zhimokf/article/details/137958615

更多framework假威风耗:androidframework007

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1556524.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解 Spring Cache 的工作原理及集成其它第三方缓存

目录 1、Spring Cache 简介2、常用注解2.1、常用注解介绍2.2、常用注解的主要参数 3、缓存注解上 SPEL 表达式可使用的元数据4、入门案例4.1、引入依赖4.2、开启缓存功能4.3、使用缓存4.3.1、新建一个 UserServiceImpl4.3.2、新建一个 UserController 5、工作原理5.1、缓存自动…

Python从0到100(六十二):机器学习实战-预测波士顿房价

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

77寸OLED透明触摸屏有哪些应用场景

说到77寸OLED透明触摸屏,那可真是市场营销中的一大亮点,应用场景多到数不清!我这就给你细数几个热门的: 商业展示:这可是77寸OLED透明触摸屏的拿手好戏!在高端零售店铺里,它可以作为陈列窗口&am…

大模型之大模型压缩(量化、剪枝、蒸馏、低秩分解),推理(vllm)

目录 前言 一、模型量化(quantization) 1. 量化概念 2. 模型量化优点 3. 什么情况下应该/不应该使用模型量化 4. 落地挑战 5. 量化方法 5.1 量化训练(Quant Aware Training, QAT) 原理 [伪量化节点(fake quant)](https://blog.csd…

​通用代码生成器典型应用场景​

​通用代码生成器典型应用场景​ 1. 通用代码生成器简介 通用代码生成器或称动词算子式通用代码生成器,是一系列各种语言的易用的整站式代码生成器。其根本原理是把方法分解成动词算子和域对象的笛卡儿积。根据动词算子式代码生成器的基本原理。所有方法&#xff…

[uni-app]小兔鲜-08云开发

uniCloud可以通过JS开发服务端,包含云数据库, 云函数, 云存储等功能, uniCloud可结合 uni-ui 组件库使用 效果展示: <picker>城市选择组件不支持h5端和APP端, 所以我们使用 <uni-data-picker>组件进行兼容处理 <uni-data-picker>的数据使用云数据库的数据 云…

项目——超级马里奥——Day(2)

争取今天晚上能搞一半啊&#xff0c;啊啊啊啊&#xff0c;感觉事多的忙不过来 设计思路&#xff1a; 1&#xff09;创建并完成常量类 ------->一张图片的情况 先完成对图片的封装------>把图片加载一遍 &#xff08;老实说&#xff0c;我也不太知道为什么&#xff0…

Stable Diffusion整合包与手动本地部署结合内网穿透远程AI绘画!

前言 文章目录 前言1. 本地部署Stable Diffusion Web UI 1.1 整合包安装1.2 手动安装Stable Diffusion Web UI 2. 安装Cpolar内网穿透3. 实现公网访问Stable Diffusion Web UI4. 固定Stable Diffusion Web UI 公网地址 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学…

六自由度机械重力补偿控制

1.动力学方程 六自由度机械臂动力学方程形式如下&#xff1a; 进行重力补偿&#xff0c;就是在驱动力矩中对重力G进行补偿&#xff0c;从而消除重力的影响&#xff0c;这样就能够在进行闭环控制的时候避免重力影响带来的大超调问题&#xff0c;使得机器人更好的实现轨迹跟踪控…

(附源码)基于springboot的“我来找房”微信小程序的设计与实现-计算机毕设 23157

基于springboot的“我来找房”微信小程序的设计与实现 摘要 随着移动互联网的快速发展&#xff0c;微信小程序作为一种轻量级的应用程序形式&#xff0c;已经成为人们日常生活的重要组成部分。为了满足广大用户在租房方面的需求&#xff0c;本文设计并实现了一个基于SpringBoot…

FredNormer: 非平稳时间序列预测的频域正则化方法

时间序列预测是一个具有挑战性的任务,尤其是在处理非平稳数据时。现有的基于正则化的方法虽然在解决分布偏移问题上取得了一定成功但仍存在局限性。这些方法主要在时间域进行操作,可能无法充分捕捉在频域中更明显的动态模式,从而导致次优的结果。 FredNormer论文的研究目的主要…

【C++】认识匿名对象

文章目录 目录 文章目录前言一、对匿名对象的解读二、匿名对象的对象类型三、匿名对象的使用总结 前言 在C中&#xff0c;匿名对象是指在没有呗命名的情况下创建的临时对象。它们通常在单个语句中执行一系列操作或调用某个函数&#xff0c;并且不需要将结果存放进变量中。 匿名…

Oracle登录报错-ORA-01017: invalid username/password;logon denied

接上文&#xff1a;Oracle创建用户报错-ORA-65096: invalid common user or role name 我以为 按照上文在PDB里创建了用户&#xff0c;我以为就可以用PLSQL远程连接了&#xff0c;远程服务器上也安装了对应版本的Oracle客户端&#xff0c;但是我想多了&#xff0c;客户只是新建…

使用Python查找WeChat和QQ的安装路径和文档路径

在日常工作和生活中&#xff0c;我们经常需要查找某些应用程序的安装位置或者它们存储文件的位置。特别是对于像WeChat&#xff08;微信&#xff09;和QQ这样的即时通讯软件&#xff0c;了解它们的文件存储位置可以帮助我们更好地管理我们的聊天记录和共享文件。今天&#xff0…

【Diffusion分割】Cold SegDiffusion:医学图像分割的扩散模型

Cold SegDiffusion: A novel diffusion model for medical image segmentation 摘要&#xff1a; 随着深度学习的发展&#xff0c;扩散模型在医学图像分割任务中表现出了卓越的性能。然而&#xff0c;传统的分割扩散模型通常采用随机高斯噪声生成分割掩膜&#xff0c;导致分割…

Java建筑行业智能化管理系统源码,PC端、手机端、大屏端源码,智慧工地管理平台源码,智慧建设平台 智慧住建平台

智慧工地平台全套源码合作 智慧工地是指运用现代信息技术&#xff0c;如物联网&#xff08;IoT&#xff09;、大数据、人工智能&#xff08;AI&#xff09;、云计算、移动互联网等&#xff0c;对传统建筑工地进行智能化改造和管理的新型工地。它通过高度集成的系统和设备&#…

NIO实现聊天室之:一切都要从网络编程的基础开始聊起!

一、写在开头 大家好,Build哥回来啦!停更了大概2个月之久,之前有段时间去写小说去了,后来又因为公司活太多,牛马干的太投入,就拉下了博客的更新,国庆节期间,难得的闲下来,准备回归老本行啦。 大致的翻看了一下之前更新的内容,已经写到了Java的IO部分,作为网络传输…

eNodeB User Manual-Introduction

eNodeB architecture ### 概述 srsENB是一个完全由软件实现的LTE eNodeB基站。它作为一个应用程序运行在标准的基于Linux的操作系统上&#xff0c;能够连接到任何LTE核心网络&#xff08;EPC&#xff09;并创建一个本地LTE小区。为了通过空气传输和接收无线电信号&#xff0c;…

深入浅出解析大模型:探索智能体(Agent)

大语言模型 vs 人类 大语言模型很强大&#xff0c;就像人类的大脑一样拥有思考的能力。如果人类只有大脑&#xff0c;没有四肢&#xff0c;没有工具&#xff0c;是没办法与世界互动的。如果我们能给大模型配备上四肢和工具呢&#xff1f;大模型是不是就会打破次元壁&#xff0…

探索Python文本处理的新境界:textwrap库揭秘

文章目录 **探索Python文本处理的新境界&#xff1a;textwrap库揭秘**一、背景介绍二、textwrap库是什么&#xff1f;三、如何安装textwrap库&#xff1f;四、简单函数使用方法4.1 wrap()4.2 fill()4.3 shorten()4.4 dedent()4.5 indent() 五、实际应用场景5.1 格式化日志输出5…