Android模拟点击屏幕,实现按键精灵点击屏幕功能
我在实现安卓模拟点击屏幕固定位置时尝试了很多方法,碰了不少壁,现在我将我实现的方法分享给大家,以及我尝试过的方法也分享给大家,让大家在开发的路上少走些弯路。
首先我尝试用安卓辅助功能AccessibilityService类实现模拟屏幕点击,但是这个类只能找到页面的控件,然后对控件进行模拟点击,不能实现对屏幕的某个位置进行点击,这个方法失败后我就试了另一种Instrumentation方法,这种方法确实可以点击屏幕上任何位置,而且点击事件可以生效,但是退出程序就不能进行了,程序出现错误,提示没有INJECT_EVENTS权限,但是加入INJECT_EVENTS权限后,还是出错,查了一下资料,说可以在添加android:sharedUserId="android.uid.system"获取系统共享签名,但是加入后生成的APK无法安装的手机上。
使用Instrumentation方法点击手机屏幕的任何位置
import java.io.IOException;
import android.app.Instrumentation;
import android.os.SystemClock;
import android.util.Log;
import android.view.MotionEvent;
public class ThreadClass extends Thread {
private int x,y;
//400,689
@Override
public void run() {
while(true)
{
//利用ProcessBuilder执行shell命令
/String[] order = {
"input",
"tap",
"" + x,
"" + y
};
Log.d("点击位置", x+","+y);
try {
new ProcessBuilder(order).start();
} catch (IOException e) {
e.printStackTrace();
}/
// 可以不用在 Activity 中增加任何处理,各 Activity 都可以响应
try {
Instrumentation inst = new Instrumentation();
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),
MotionEvent.ACTION_DOWN, x, y, 0));
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),
MotionEvent.ACTION_UP, x, y, 0));
Log.d("点击位置", x+","+y);
}catch(Exception e) {
Log.e("Exception when sendPointerSync", e.toString());
}
//线程睡眠3s
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public ThreadClass(int x,int y){
this.x=x;
this.y=y;
}
}
其中x,y是需要点击的屏幕左边,以左上角为原点的直角坐标系统
加入INJECT_EVENTS权限
添加android:sharedUserId="android.uid.system"位置如下,写安卓的应该都可以明白
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.clickservice"
android:versionCode="1"
android:versionName="1.0"
android:sharedUserId="android.uid.system"
为了解决这个错误,我按照网上说的方法进行,使用安卓签名工具SignApk.jar对编译的apk进行签名,签名后的APK还是无法安装在手机上,还有一种解决这问题的方法就是使用android源码编译,相信这种方法会让大多数人无从下手,光将android源码编译的环境搭配起来都不是一件容易的事,有兴趣的可以尝试一下这种方法,下面就步入我们今天要讲的主题adb shell。
首先我们在windows下通过adb shell控制手机,在此之前,保证你的手机已经连接电脑,进入eclipse adt开发环境下的adb所在文件目录,以我的为例,路径为..\adt-bundle-windows-x86-20130917\sdk\platform-tools,以下是我的目录截图,可以对着找到该目录。
在该目录下,按下shift键后点击鼠标右键,在弹出窗口中选择“在此处打开命令窗口(W)”,也可以直接cmd进入这目录,在命令窗口输入:adb shell 进入adb shell命令状态,此后就可以用shell命令控制你的手机了。
我在此就简单介绍一些命令:
getevent -p
查看哪个设备包含event 体系里 宽(0035)和高(0036),那么这个设备就是我们的安卓手机,例如这里的设备名称为/dev/input/event1
模拟发送事件
getevent/sendevent是Android系统下的一个工具,可以模拟多种按键和触屏操作,产生的是raw event,raw event经过event hub处理产生最终的gesture事件。getevent用于获取当前系统input设备的一些参数和实时事件的数据;sendevent用于发送input事件,这俩命令的作用就是相当于解放了手,可以通过命令直接调用Linux底层来控制手机,工具的源码位于Android SDK的system/core/toolbox下(sendevent.c getevent.c)。
发送键盘事件
用法说明:
adb shell input keyevent “value”
input text
input keyevent
input tap
input swipe
如上,input后可以跟很多参数, text相当于输入内容,keyevent相当于手机物理或是屏幕按键,tap相当于touch事件,swipe相当于滑动~~是不是很赞?先列举 input keyevent 几个比较常用的code值:
input keyevent 3 // Home
input keyevent 4 // Back
input keyevent 19 //Up
input keyevent 20 //Down
input keyevent 21 //Left
input keyevent 22 //Right
input keyevent 23 //Select/Ok
input keyevent 24 //Volume+
input keyevent 25 // Volume-
input keyevent 82 // Menu 菜单
附:input keyevent所对应全部key值:
- KeyCode Keyevent Value
- 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
通过以上的介绍你应该对adb shell命令有所了解了吧,但是如何用代码来实现呢,以下就是代码执行shell命令
/**
- 执行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("getevent -p");
execShellCmd("sendevent /dev/input/event1 1 158 1");
execShellCmd("sendevent /dev/input/event1 1 158 0");
execShellCmd("input keyevent 3");//home
execShellCmd("input text 'helloworld!' ");
execShellCmd("input tap 168 252");
execShellCmd("input swipe 100 250 200 280");
注意使用sendevent执行事件时,可以看到sendevent需要4个参数即:device,type,code,value。这些值可以由input子系统定义,也可以从getevent里面获取。type其实就是和getevent中的支持事件类型所对应的, value=1是按下,value=0是弹起,也就是说只有当两个命令同时执行时命令才会生效,也就是下面两句要先后一并执行
execShellCmd("sendevent /dev/input/event1 1 158 1");
execShellCmd("sendevent /dev/input/event1 1 158 0");
如果要退出程序后,继续执行模拟点击屏幕,只要写一个后台运行的Service挂在后台运行即可,到此模拟点击手机屏幕的功能就实现了。因为写这篇文章的时候,经验不足,请大家多多指教
本文章对应程序,实现按键精灵模拟点击源码:http://download.csdn.net/download/yuanhengzhw/10254876
原文链接:https://blog.csdn.net/yuanheng19930119/article/details/87973933
推荐阅读:
- 分享
- 举报
-
浏览量:2553次2020-08-03 13:36:13
-
浏览量:2794次2020-08-03 13:38:16
-
2020-08-03 13:37:42
-
浏览量:2183次2020-08-03 12:02:37
-
浏览量:1825次2020-08-03 12:01:28
-
浏览量:2042次2020-08-03 13:33:48
-
浏览量:1629次2020-08-03 13:34:42
-
浏览量:9386次2021-07-24 18:04:04
-
浏览量:729次2024-01-02 09:46:50
-
浏览量:1559次2020-08-14 18:34:40
-
浏览量:1990次2019-07-24 14:04:11
-
浏览量:2116次2022-02-12 09:00:16
-
浏览量:1935次2022-05-17 09:00:19
-
浏览量:8827次2022-06-11 10:47:27
-
浏览量:2286次2018-01-06 21:06:33
-
浏览量:1844次2018-03-03 00:27:46
-
浏览量:689次2023-03-01 14:32:25
-
浏览量:2375次2019-08-30 10:35:08
-
浏览量:2349次2022-01-22 09:00:25
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
TT_123456789
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明