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

转载请注明出处:http://www.xiaocool.cn/article/25

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

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 <string>  
           input keyevent <key code number or name>           input tap <x> <y>
           input swipe <x1> <y1> <x2> <y2>
    如上,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

猜你喜欢

转载自blog.csdn.net/icyfirekiss/article/details/86657775