Framework 全局监听屏幕点击事件 INPUT_EVENT_INJECTION

2024-08-22 06:08

本文主要是介绍Framework 全局监听屏幕点击事件 INPUT_EVENT_INJECTION,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求:用户点击屏幕后取消原有定时任务,无操作后顺延原来定时任务

简单分析

要想全局监听,那必须是在 framework 中了,应该从哪里切入呢?先看看 log,每点击一次屏幕后发现打印

InputDispatcher: Asynchronous input event injection succeeded.

全局搜索找到 frameworks\native\services\inputflinger\InputDispatcher.cpp 中

这就有点难顶了,cpp 中想要通知 java 层还是有点困难的,一开始尝试了在此处发送广播

#include <unistd.h>

switch (injectionResult) {
case INPUT_EVENT_INJECTION_SUCCEEDED:
ALOGV(“Asynchronous input event injection succeeded.”);

execlp(“am”, “am”, “broadcast”,
“-n”, “com.android.systemui/com.pdd.sutie.CustomerReceiver”,
“-a”, “com.pdd.action.inputevent.inject”,
NULL);
exit(errno);

通过函数 execlp() 调用 am 指令发送广播,尝试后发现会把 system 进程搞挂,看来 execlp() 不能在此使用,那就只能搂底浆了,

从 cpp 往上找,最终找到 frameworks\base\services\core\java\com\android\server\input\InputManagerService.java 中

调用顺序如下

InputManagerService.java
injectInputEventInternal(event, mode)

com_android_server_input_InputManagerService.cpp
im->getInputManager()->getDispatcher()->injectInputEvent(

InputDispatcher.cpp
int32_t InputDispatcher::injectInputEvent(const InputEvent* event,
int32_t injectorPid, int32_t injectorUid, int32_t syncMode, int32_t timeoutMillis,
uint32_t policyFlags)

解决办法

frameworks\base\services\core\java\com\android\server\input\InputManagerService.java

@Override // Binder callpublic boolean injectInputEvent(InputEvent event, int mode) {return injectInputEventInternal(event, mode);}private boolean injectInputEventInternal(InputEvent event, int mode) {if (event == null) {throw new IllegalArgumentException("event must not be null");}if (mode != InputManager.INJECT_INPUT_EVENT_MODE_ASYNC&& mode != InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH&& mode != InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_RESULT) {throw new IllegalArgumentException("mode is invalid");}final int pid = Binder.getCallingPid();final int uid = Binder.getCallingUid();final long ident = Binder.clearCallingIdentity();final int result;try {result = nativeInjectInputEvent(mPtr, event, pid, uid, mode,INJECTION_TIMEOUT_MILLIS, WindowManagerPolicy.FLAG_DISABLE_KEY_REPEAT);} finally {Binder.restoreCallingIdentity(ident);}switch (result) {case INPUT_EVENT_INJECTION_PERMISSION_DENIED:Slog.w(TAG, "Input event injection from pid " + pid + " permission denied.");throw new SecurityException("Injecting to another application requires INJECT_EVENTS permission");case INPUT_EVENT_INJECTION_SUCCEEDED://cczheng add for listen lcd input startandroid.util.Log.e("InputDispatcher", "Input event injection from pid " + pid + " succeeded.");Intent pIntent = new Intent("com.pdd.action.inputevent.inject");pIntent.setComponent(new android.content.ComponentName("com.android.systemui","com.pdd.sutie.CustomerReceiver"));mContext.sendBroadcast(pIntent);//cczheng add for listen lcd input endreturn true;case INPUT_EVENT_INJECTION_TIMED_OUT:Slog.w(TAG, "Input event injection from pid " + pid + " timed out.");return false;case INPUT_EVENT_INJECTION_FAILED:default:Slog.w(TAG, "Input event injection from pid " + pid + " failed.");return false;}}

Android Input(四) -InputDispatcher分发事件
Android10 InputManagerService事件输入输出

这篇关于Framework 全局监听屏幕点击事件 INPUT_EVENT_INJECTION的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095449

相关文章

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

HTML input 标签示例详解

《HTMLinput标签示例详解》input标签主要用于接收用户的输入,随type属性值的不同,变换其具体功能,本文通过实例图文并茂的形式给大家介绍HTMLinput标签,感兴趣的朋友一... 目录通用属性输入框单行文本输入框 text密码输入框 password数字输入框 number电子邮件输入编程框

解决Entity Framework中自增主键的问题

《解决EntityFramework中自增主键的问题》:本文主要介绍解决EntityFramework中自增主键的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Entity Framework中自增主键问题解决办法1解决办法2解决办法3总结Entity Fram

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

Kotlin Compose Button 实现长按监听并实现动画效果(完整代码)

《KotlinComposeButton实现长按监听并实现动画效果(完整代码)》想要实现长按按钮开始录音,松开发送的功能,因此为了实现这些功能就需要自己写一个Button来解决问题,下面小编给大... 目录Button 实现原理1. Surface 的作用(关键)2. InteractionSource3.

macOS Sequoia 15.5 发布: 改进邮件和屏幕使用时间功能

《macOSSequoia15.5发布:改进邮件和屏幕使用时间功能》经过常规Beta测试后,新的macOSSequoia15.5现已公开发布,但重要的新功能将被保留到WWDC和... MACOS Sequoia 15.5 正式发布!本次更新为 Mac 用户带来了一系列功能强化、错误修复和安全性提升,进一步增

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja