android 多个按键精灵,Android 一种通用的按键精灵的实现思路

转载请注明出处:校酷网-大学生菁英创业平台

实现按键精灵的思路主要有三种:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值