Android 一种通用的按键精灵的实现思路 您所在的位置:网站首页 按键精灵是什么原理 Android 一种通用的按键精灵的实现思路

Android 一种通用的按键精灵的实现思路

2023-12-24 00:38| 来源: 网络整理| 查看: 265

转载请注明出处:校酷网-大学生菁英创业平台 实现按键精灵的思路主要有三种:

1.AccessibilityService辅助类,这个类是设计用来帮助残障人士使用android 手机的,我们可以利用它实现按键精灵的部分功能,因为利用这个类只能找到页面的控件,然后对控件进行模拟点击,不能实现对屏幕的某个位置进行点击

2.Instrumentation方法,这种方法确实可以点击屏幕上任何位置,而且点击事件可以生效,但是退出程序就不能进行了,程序出现错误,提示没有INJECT_EVENTS权限,在如今第三方Rom横行的今天,几乎不可能获取到这个权限。

3.adb shell命令的方法,这种方法很通用,能在所有android设备上使用,缺点是需要手机需要root,程序需要获取到root权限,才能实现点击;

我们经常使用Android adb shell命令在电脑上查看与之相连的Android设备各种信息,今天我们选择用adb shell 命令来实现一种最为通用,兼容性最强的按键精灵;

windows端使用adb shell命令

1.win+R键打开cmd,输入adb shell,会连接到当前与电脑连接的手机(如果你没有配置adb 命令的环境变量,要cd 命令进入到 sdk 下的 platform—tools目录 再输入 adb shell命令)

image

2.gettevent /sendevent 获取输入设备事件信息

getevent用于获取当前系统input设备的一些参数和实时事件的数据

sendevent用于发送input事件,用来模拟物理按键的点击和屏幕任意位置的点击

这俩命令的作用就是相当于解放了手,可以通过命令直接调用Linux底层来控制手机,工具的源码位于Android SDK的system/core/toolbox下(sendevent.c getevent.c)

(1)输入getevent -p 获取当前Android 设备的信息

image可以看到输出的信息相当复杂,我们梳理一下可以看到当前设备有5个 devive 设备, 其中每个设备下KEY(0001)、ABS(0003)、SYN(0000)等表示该设备所支持的事件类型:EV_SYN [0000] (同步事件),EV_KEY [0001] (按键事件),EV_ABS [0003] (绝对值事件), ** 从name:可以看出 这些输入设备 有耳机孔,物理按键,gps ,屏幕输入等, 我们真正需要的是name :“synaptics—rmi—ts” 这个屏幕输入设备 如下图:

image我们观察上图中的abs 信息 其中的 0035 和 0036两项 max值 1080 *1926(注意:也许你的手机0035 0036 两项的max信息是一个很大的值,不要担心,你只要网上搜索一下你手机真实的分辨率信息,两者分别相除就可以得到一个倍数,要记好这个倍数) 就是手机屏幕的分辨率信息,这两项的信息相当重要,是我们接下来工作的基础;

3.观察点击屏幕后getevent输出的坐标信息;

接下来点击屏幕你会发现屏幕上滚动了十几行复杂的数据,如下图: image

无需担心过多,我们只要观察 ,第三列 0035 和 0036 分别对应的信息,这就是刚才你点击的屏幕所对应 16 进制的坐标信息 0x3a5 和0x568(还记得上面的那个倍数吗,如果上一步你得到的不是真实的分辨率信息,不要忘了,要除以那个倍数,才是真实的16进制坐标信息奥) ,这正是我们所需要的,这个坐标正好对应着我手机上的浏览器图标,也就是说,一会我们会实现模拟点击启动浏览器(你可以对应一个你想打开应用的图标);

4.利用input 向设备发送模拟按键事件

input keyevent 发送键盘事件 用法说明: adb shell input keyevent “value” usage: input ... input text    input keyevent input tap input swipe 如上,input后可以跟很多参数, text相当于输入内容,keyevent相当于手机物理或是屏幕按键   tap相当于touch事件,swipe相当于滑动~~是不是很赞? adb shell 输入 input key event 3 你会发现退回了桌面,这个事件相当于手机的home键,怎么样是不是很酷?   文章后面会附上详细的事件对应信息 好了,回到正题,刚才我们得到了点击事件的 16 进制坐标 0x3a5 和0x568,我们需要把他转化成10进制(input tab 需要的是 10进制坐标信息)为 933 和 1384

adb shell命令输入 input tap 933 1384 你会发现我们已经成功启动了浏览器,到这里我们已经可以再 windows 系统实现模拟点击事件, 可是如何才能在代码里用呢,别着急接着往下看: 在程序中引用adb shell命令

1.获取root权限,发送input 键盘点击事件:

需要先root你的手机

/** 

执行shell命令 

@param cmd  */ private void execShellCmd(String cmd) { 

try {   // 申请获取root权限,这一步很重要,不然会没有作用   Process process = Runtime.getRuntime().exec("su");   // 获取输出流   OutputStream outputStream = process.getOutputStream();   DataOutputStream dataOutputStream = new DataOutputStream(   outputStream);   dataOutputStream.writeBytes(cmd);   dataOutputStream.flush();   dataOutputStream.close();   outputStream.close();   } catch (Throwable t) {   t.printStackTrace();   }   } 在需要执行的地方:

execShellCmd("input tap 933 184"); 你可以把具体的逻辑卸载一个服务里,可以轻松实现录制脚本,运行点击命令,至此,实现一个自己的按键精灵是不是很容易呢;

附表

附表:input keyevent所对应全部key值:

KEYCODE_MENU 1 KEYCODE_SOFT_RIGHT 2 KEYCODE_HOME 3 KEYCODE_BACK 4 KEYCODE_CALL 5 KEYCODE_ENDCALL 6 KEYCODE_0 7 KEYCODE_1 8 KEYCODE_2 9 KEYCODE_3 10 KEYCODE_4 11 KEYCODE_5 12 KEYCODE_6 13 KEYCODE_7 14 KEYCODE_8 15 KEYCODE_9 16 KEYCODE_STAR 17 KEYCODE_POUND 18 KEYCODE_DPAD_UP 19 KEYCODE_DPAD_DOWN 20 KEYCODE_DPAD_LEFT 21 KEYCODE_DPAD_RIGHT 22 KEYCODE_DPAD_CENTER 23 KEYCODE_VOLUME_UP 24 KEYCODE_VOLUME_DOWN 25 KEYCODE_POWER 26 KEYCODE_CAMERA 27 KEYCODE_CLEAR 28 KEYCODE_A 29 KEYCODE_B 30 KEYCODE_C 31 KEYCODE_D 32 KEYCODE_E 33 KEYCODE_F 34 KEYCODE_G 35 KEYCODE_H 36 KEYCODE_I 37 KEYCODE_J 38 KEYCODE_K 39 KEYCODE_L 40 KEYCODE_M 41 KEYCODE_N 42 KEYCODE_O 43 KEYCODE_P 44 KEYCODE_Q 45 KEYCODE_R 46 KEYCODE_S 47 KEYCODE_T 48 KEYCODE_U 49 KEYCODE_V 50 KEYCODE_W 51 KEYCODE_X 52 KEYCODE_Y 53 KEYCODE_Z 54 KEYCODE_COMMA 55 KEYCODE_PERIOD 56 KEYCODE_ALT_LEFT 57 KEYCODE_ALT_RIGHT 58 KEYCODE_SHIFT_LEFT 59 KEYCODE_SHIFT_RIGHT 60 KEYCODE_TAB 61 KEYCODE_SPACE 62 KEYCODE_SYM 63 KEYCODE_EXPLORER 64 KEYCODE_ENVELOPE 65 KEYCODE_ENTER 66 KEYCODE_DEL 67 KEYCODE_GRAVE 68 KEYCODE_MINUS 69 KEYCODE_EQUALS 70 KEYCODE_LEFT_BRACKET 71 KEYCODE_RIGHT_BRACKET 72 KEYCODE_BACKSLASH 73 KEYCODE_SEMICOLON 74 KEYCODE_APOSTROPHE 75 KEYCODE_SLASH 76 KEYCODE_AT 77 KEYCODE_NUM 78 KEYCODE_HEADSETHOOK 79 KEYCODE_FOCUS 80 KEYCODE_PLUS 81 KEYCODE_MENU 82 KEYCODE_NOTIFICATION 83 KEYCODE_SEARCH 84 TAG_LAST_KEYCODE 85



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有