博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android模拟按键——源码环境下开发应用程序 ---编译jar(android可执行程序)
阅读量:4316 次
发布时间:2019-06-06

本文共 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

你可能感兴趣的文章
面试题5:字符串替换空格
查看>>
JSP九大内置对象及四个作用域
查看>>
ConnectionString 属性尚未初始化
查看>>
MySQL基本命令和常用数据库对象
查看>>
poj 1222 EXTENDED LIGHTS OUT(位运算+枚举)
查看>>
进程和线程概念及原理
查看>>
Lucene、ES好文章
查看>>
android 生命周期
查看>>
jquery--this
查看>>
MySQL 5.1参考手册
查看>>
TensorFlow安装流程(GPU加速)
查看>>
OpenStack的容器服务体验
查看>>
BZOJ 1066 蜥蜴(网络流)
查看>>
提高批量插入数据的方法
查看>>
Linux重启Mysql命令
查看>>
前端模块化:RequireJS(转)
查看>>
应用程序缓存的应用(摘抄)
查看>>
jQuery基础知识,很赞的!!!
查看>>
[Codevs] 线段树练习5
查看>>
Amazon
查看>>