Android Input事件注入

1. Android可以通过adb shell input xxx命令注入输入事件,调用IMS.injectInputEvent,最终走到通过JNI调用InputDispatcher注入事件,没有经过InputReader

public class Input extends BaseCommand {// ... ... ... ...Input() {COMMANDS.put("text", new InputText());COMMANDS.put("keyevent", new InputKeyEvent());COMMANDS.put("tap", new InputTap());COMMANDS.put("swipe", new InputSwipe());COMMANDS.put("draganddrop", new InputDragAndDrop());COMMANDS.put("press", new InputPress());COMMANDS.put("roll", new InputRoll());COMMANDS.put("motionevent", new InputMotionEvent());}@Overridepublic void onRun() throws Exception {String arg = nextArgRequired();int inputSource = InputDevice.SOURCE_UNKNOWN;// Get source (optional).if (SOURCES.containsKey(arg)) {inputSource = SOURCES.get(arg);arg = nextArgRequired();}// Get displayId (optional).int displayId = INVALID_DISPLAY;if ("-d".equals(arg)) {displayId = getDisplayId();arg = nextArgRequired();}// Get command and run.InputCmd cmd = COMMANDS.get(arg);if (cmd != null) {try {cmd.run(inputSource, displayId);return;} catch (NumberFormatException ex) {throw new IllegalArgumentException(INVALID_ARGUMENTS + arg);}}throw new IllegalArgumentException("Error: Unknown command: " + arg);}// ... ... ... ...class InputKeyEvent implements InputCmd {@Overridepublic void run(int inputSource, int displayId) {String arg = nextArgRequired();final boolean longpress = "--longpress".equals(arg);if (longpress) {arg = nextArgRequired();}do {final int keycode = KeyEvent.keyCodeFromString(arg);sendKeyEvent(inputSource, keycode, longpress, displayId);} while ((arg = nextArg()) != null);}private void sendKeyEvent(int inputSource, int keyCode, boolean longpress, int displayId) {final long now = SystemClock.uptimeMillis();int repeatCount = 0;KeyEvent event = new KeyEvent(now, now, KeyEvent.ACTION_DOWN, keyCode, repeatCount,0 /*metaState*/, KeyCharacterMap.VIRTUAL_KEYBOARD, 0 /*scancode*/, 0 /*flags*/,inputSource);event.setDisplayId(displayId);injectKeyEvent(event);if (longpress) {repeatCount++;injectKeyEvent(KeyEvent.changeTimeRepeat(event, now, repeatCount,KeyEvent.FLAG_LONG_PRESS));}injectKeyEvent(KeyEvent.changeAction(event, KeyEvent.ACTION_UP));}}

2. 通过InputManager提供的接口注入

invokeSetDisplayId(mMotionSetDisplayId, ev, displayId); Class clm = MotionEvent.class;m.invoke(ev, displayId);   // mMotionSetDisplayId = clm.getMethod("setDisplayId", int.class);            InjectionUtil.getInstance().injectInputEvent(ev, INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);invokeInjectInputEvent(event, mode);Class cl = InputManager.class;Method method = cl.getMethod("getInstance");            mInjectInputEvent = cl.getMethod("injectInputEvent", InputEvent.class, int.class);mInjectInputEvent.invoke(inputManager, event, mode);  //InputManager::injectInputEvent
@frameworks/base/core/java/android/hardware/input/InputManager.javareturn mIm.injectInputEvent(event, mode);......
@frameworks/native/services/inputflinger/dispatcher/InputDispatcher.cpp                 InputDispatcher::injectInputEvent
@frameworks/native/include/input/Input.h          event->getDisplayId()needWake |= enqueueInboundEventLocked(std::move(injectedEntries.front()));mInboundQueue.push_back(std::move(newEntry));  //向InputDispatcher中的mInboundQueue队列注入事件

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ZXL-2000砌体砂浆强度点荷仪

一、产品简介: 砌体砂浆强度点荷仪(又名:砂浆点荷仪),是根据GB/T50315-2000《砌体工程现场检验技术规程》而研制生产的。是砌体砂浆强度检测的专用仪器,其特点是能在现场或试验室直接测试,不影…

最短路模型——AcWing 188. 武士风度的牛

最短路模型 定义 最短路模型是图论中的一个经典问题,旨在寻找从图中一个顶点到另一个顶点的路径,使得这条路径上的边(或边的权重)之和最小。这一模型在许多实际问题中有着广泛的应用,比如网络路由、地图导航、物流配…

【深度学习】图生图img3img论文原理,SD EDIT

https://arxiv.org/abs/2108.01073 摘要 引导图像合成技术使普通用户能够以最小的努力创建和编辑逼真的图像。关键挑战在于平衡对用户输入(例如,手绘的彩色笔画)的忠实度和合成图像的真实感。现有的基于GAN的方法试图通过使用条件GAN或GAN反…

面试相关-接口测试常问的问题

1.为什么要做接口测试 (1)现在大多系统都是前后端分离的项目,前端和后端的进度可能不一样,那为了尽早的进入测试,前端界面没有开发完成的情况下,只要后端的接口开发完了,就可以提前做接口测试了; (2)基于安全考虑,只依赖前端进行限制,已经完全不满足系统的安全性…

c++习题02-浮点数求余

目录 一,问题 二,思路 三,代码 一,问题 二,思路 虽然在浮点类型中没有取余的运算(无法直接使用%符号取余),但是我们都知道在数学中,除法是减法的连续运算&#xff…

trie[讲课留档]

字典树 1.字典树简介 字典树 ( Trie 树 ) 又称单词查找树, 是一种用于在字符串集合中高效地存储和查找字符串的树形数据结构。 我们首先通过一张图来理解字典树的结构: 我们假定结点的顺序按照图中给定的顺序进行编号,容易发现&#xff0c…

Golang-slice理解

slice golang-slice语雀笔记整理 slicego为何设计slice?引用传递实现扩容机制 go为何设计slice? 切片对标其他语言的动态数组,底层通过数组实现,可以说是对数组的抽象,底层的内存是连续分配的所以效率高,可…

Spring Boot项目的两种发布方式

一、通过jar包发布 1、在pom中添加一个SpringBoot的构建的插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><!--自动检测项目中的 main 函数--><artifactId>spring-boot-maven-plugin</artifactId>…

一文get懂kwai短视频助力巴西博弈slots游戏广告优势

一文get懂kwai短视频助力巴西博弈slots游戏广告优势 在数字化时代&#xff0c;短视频广告凭借其独特的魅力和高效的传播方式&#xff0c;成为了各大品牌进行营销推广的重要手段。特别是在巴西这个充满活力的国家&#xff0c;kwai短视频广告以其独特的方式&#xff0c;为博弈游…

2024企业数据资产化及数据资产入表方案梳理

01 数据资产入表&#xff1a;是一个将组织的各类数据资产进行登记、分类、评估和管理的流程。 数据资产包括&#xff1a;客户信息、交易记录、产品数据、财务数据等。 做个比喻吧&#xff1a;数据资产入表就像是给公司的数据资产做“人口普查”—— ①找出公司有哪些数据找…

Pytorch课程论文设计参考

Pytorch下基于卷积神经网络的手写数字识别 论文格式 利用wps初步美化论文格式教程 wps论文格式变的的原因 格式变的根本原因是word为流式文件&#xff0c;就算同是word同一个版本不同电脑也会有可能变&#xff0c;字体变是因为没有嵌入字体然后观看的那台没有这个字体。 一、…

机器学习环境搭建

前言 个人笔记&#xff0c;记录框架和小问题&#xff0c;没有太详细记载。。 1、Anaconda安装 下载地址&#xff1a; Free Download | Anaconda &#xff08;慢&#xff09; ​ 国内镜像&#xff1a;https://link.csdn.net/?targethttp%3A%2F%2Fitcxy.xyz%2F241.html 下载…

【硬件开发】安规电容X电容和Y电容

为什么有安规电容 国家为了保护人民的安全要求&#xff0c;电容器失效后&#xff0c;不会导致电击&#xff0c;不危及人身安全的安全电容器 安规电容的作用 滤除雷电冲击波&#xff0c;以及插拔插座的高频噪声 X电容 聚酯电容 位置 X电容位于火线和零线之间 作用 滤除…

Bunny的PT+SFT训练

GitHub - BAAI-DCAI/Bunny: A family of lightweight multimodal models.A family of lightweight multimodal models. . Contribute to BAAI-DCAI/Bunny development by creating an account on GitHub.https://github.com/BAAI-DCAI/Bunny1.环境安装 conda create -n bunny …

观测云产品更新 | Pipelines、智能监控、日志数据访问等

观测云更新 Pipelines 1、Pipelines&#xff1a;支持选择中心 Pipeline 执行脚本。 2、付费计划与账单&#xff1a;新增中心 Pipeline 计费项&#xff0c;统计所有命中中心 Pipeline 处理的原始日志的数据大小。 监控 1、通知对象管理&#xff1a;新增权限控制。配置操作权…

经典小游戏(一)C实现——三子棋

switch(input){case 1:printf("三子棋\n");//这里先测试是否会执行成功break;case 0:printf("退出游戏\n");break;default :printf("选择错误&#xff0c;请重新选择!\n");break;}}while(input);//直到输入的结果为假&#xff0c;循环才会结束} …

springboot是否可以代替spring

Spring Boot不能直接代替Spring&#xff0c;但它是Spring框架的一个扩展和增强&#xff0c;提供了更加便捷和高效的开发体验。以下是关于Spring Boot和Spring关系的详细解释&#xff1a; Spring框架&#xff1a; Spring是一个广泛应用的开源Java框架&#xff0c;提供了一系列模…

什么是有效的电子签名?PDF电子签名怎样具备法律效力?

电子签名逐渐成为商务文书和法律文件中不可或缺的一部分。《电子签名法》自2005年4月1日起施行&#xff0c;这一立法是中国信息化法律的重要里程碑&#xff0c;为电子签名应用奠定了法律基础。电子签名不仅仅是一种技术手段&#xff0c;更是一种法律认可的签名形式。那么究竟什…

跨模型知识融合:大模型的知识融合

大模型&#xff08;LLMs&#xff09;在多个领域的应用日益广泛&#xff0c;但确保它们的行为与人类价值观和意图一致却充满挑战。传统对齐方法&#xff0c;例如基于人类反馈的强化学习&#xff08;RLHF&#xff09;&#xff0c;虽取得一定进展&#xff0c;仍面临诸多难题&#…

百刀神书!从0搭建神经网络!我服!

《Neural Networks from Scratch in Python》是一本深入浅出的书籍&#xff0c;旨在帮助读者从零开始理解和实现神经网络模型。作者使用Python语言&#xff0c;从基本的数学概念和神经网络的基本原理开始&#xff0c;逐步引导读者探索神经网络的各个组成部分。 该书介绍了神经…