Android模拟按键——源码环境下开发应用程序 ---编译jar(android可执行程序)
发布日期:2021-09-27 14:12:38 浏览次数:7 分类:技术文章

本文共 4346 字,大约阅读时间需要 14 分钟。

在http://blog.csdn.net/ericahdu 的帮助下,实现了模拟按键,在此,首先表示感谢:)在源码下写程序可以摆脱SDK的限制,毕竟SDK开放的API有限,比如我们实现模拟按键时,需要用到IWindowManager这个类,但是SDK中是不提供这个类的首先下载编译源码,然后在源码的frameworks/base/cmds下新建一个文件夹作为你新扩展模块的一个目录。比如叫做autotest,在autotest下创建一个java文件,比如AutoTest.java。编写你的程序代码,在此你可以使用IWindowManager类,在此,我模拟了按键key,长按键keypress,点触笔touch,点触笔长按touchpress,以及移动move等,代码如下:import android.view.MotionEvent;import android.view.KeyEvent;import android.view.IWindowManager;import android.os.ServiceManager;import android.os.SystemClock;import android.os.RemoteException;import android.util.Log;public class AutoTest {public static void main(String args[])throws Exception{String[] mArgs = args;try{String opt = mArgs[0];if(opt.equals("touch")){float x = Float.valueOf(mArgs[1]);float y = Float.valueOf(mArgs[2]);MotionEvent e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x, y, 0);sendPointerSync(e);e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0);sendPointerSync(e);}else if(opt.equals("move")){float x = Float.valueOf(mArgs[1]);float y = Float.valueOf(mArgs[2]);float x2 = Float.valueOf(mArgs[3]);float y2 = Float.valueOf(mArgs[4]);MotionEvent e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x, y, 0);sendPointerSync(e);e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_MOVE, x, y, 0);sendPointerSync(e);e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_MOVE, x, y, 0);sendPointerSync(e);e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_MOVE, x2, y2, 0);sendPointerSync(e);e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_MOVE, x2, y2, 0);sendPointerSync(e);e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, x2, y2, 0);sendPointerSync(e);}else if(opt.equals("key")){int keycode = Integer.valueOf(mArgs[1]);KeyEvent k = new KeyEvent(KeyEvent.ACTION_DOWN,keycode);sendKeySync(k);k = new KeyEvent(KeyEvent.ACTION_UP,keycode);sendKeySync(k);}else if(opt.equals("wait")){int millsecond = Integer.valueOf(mArgs[1]);Thread.sleep(millsecond);}else if(opt.equals("keypress")){int keycode = Integer.valueOf(mArgs[1]);int millsecond = Integer.valueOf(mArgs[2]);KeyEvent k = new KeyEvent(KeyEvent.ACTION_DOWN,keycode);sendKeySync(k);Thread.sleep(millsecond);k = new KeyEvent(KeyEvent.ACTION_UP,keycode);sendKeySync(k);                       }else if(opt.equals("touchpress")){float x = Float.valueOf(mArgs[1]);float y = Float.valueOf(mArgs[2]);int millsecond = Integer.valueOf(mArgs[3]);MotionEvent e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x, y, 0);sendPointerSync(e);Thread.sleep(millsecond);e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0);sendPointerSync(e);}else System.err.println("** Error: Unknown option: " + opt);}catch (RuntimeException ex){}Thread.sleep(2000);       }private static void sendPointerSync(MotionEvent event) {try {(IWindowManager.Stub.asInterface(ServiceManager.getService("window"))).injectPointerEvent(event, true);} catch (RemoteException e) {}}private static void sendKeySync(KeyEvent event) {try {(IWindowManager.Stub.asInterface(ServiceManager.getService("window"))).injectKeyEvent(event, true);} catch (RemoteException e) {}}}在与java文件同级创建Android.mk文件,内容如下:# Copyright 2008 The Android Open Source Project#LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES := $(call all-subdir-java-files)LOCAL_MODULE := autotestinclude $(BUILD_JAVA_LIBRARY)在终端命令行下进入autotest文件夹,输入mm命令,如果报错,则返回Android源码主目录,输入如下命令:. build/envsetup.sh此时再返回你的工程目录输入mm就可以了,编译生成一个.jar文件,位于源码的/out/target/product/generic/system/framework下将编译好的.jar文件放在设备的/system/framework下,新建一个文件,名称为autotest,内容如下:# Script to start "monkey" on the device, which has a very rudimentary# shell.#base=/systemexport CLASSPATH=$base/framework/autotest.jarexec app_process $base/bin AutoTest $*将autotest文件放在/system/bin下,用chmod修改文件属性(777)这样你可以在shell下调用你的.jar文件了比如输入 shell autotest key 24,向系统注入了调节音量的按键事件。

 

转载于:https://www.cnblogs.com/MMLoveMeMM/articles/4104651.html

转载地址:https://blog.csdn.net/FLY_THINK2012/article/details/101840938 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Android之PopupWindow弹出对话框
下一篇:Android su权限管理与分析

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年03月24日 18时12分11秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

oracle所需的环境,转:面对一个全新的oracle环境,首先应该了解什么? 2019-04-21
linux 小数四则运行,shell四则运算(整数及浮点数)的方法介绍 2019-04-21
linux系统分区后进入紧急模式,Linux系统的救援模式应用详解 2019-04-21
linux配置匿名ftp服务器,在Linux环境中使用vsftpd搭建ftp实现匿名上传详细配置 2019-04-21
linux创建硬盘分区lvm,LVM创建及分区调整、更换LVM硬盘 2019-04-21
FreeBSD可以安装Linux软件吗,在Linux服务器上面通过网络安装FreeBSD 2019-04-21
.net core linux 桌面应用,C# dotnet core + AvaloniaUI 开发桌面软件,hello world 2019-04-21
linux tcp 113错误,linux系统报tcp_mark_head_lost错误的处理方法 2019-04-21
南昌工程学院c语言答案,南昌工程学院C语言程序设计基础课件第3讲运算符和表达式... 2019-04-21
python学画画_python学画画(下) 2019-04-21
云栖社区 mysql_【直播结束,已更新回放】PG、MySQL到底哪个好?云栖说这次请来五位专家撕了一下-阿里云开发者社区... 2019-04-21
老男孩mysql 百度云_英语语录:除了你,没人能掌控你的幸福 2019-04-21
mysql驱动多次执行问题_Laravel5.2队列驱动expire参数设置带来的重复执行问题 数据库驱动... 2019-04-21
mysql获取刚新增的数据库_如何取得刚插入数据库的数据的id mysql 2019-04-21
python将10到1递减_(Python)如何将3个递减列表合并成一个递减列表? 2019-04-21
python脚本怎么用来处理数据_长时间运行数据处理python脚本的程序结构 2019-04-21
python转成c 语言_将Python对象转换为C void类型 2019-04-21
resin mysql_Eclipse+resin+mysql 安装及环境配置 2019-04-21
redis的使用 Java_java中使用redis 2019-04-21
java 数组元素位置_Java – 在数组中获取元素位置 2019-04-21