Android模拟点击屏幕,实现按键精灵点击屏幕功能

您所在的位置:网站首页 辅助功能在手机上咋找 Android模拟点击屏幕,实现按键精灵点击屏幕功能

Android模拟点击屏幕,实现按键精灵点击屏幕功能

2024-06-01 08:17| 来源: 网络整理| 查看: 265

         我在实现安卓模拟点击屏幕固定位置时尝试了很多方法,碰了不少壁,现在我将我实现的方法分享给大家,以及我尝试过的方法也分享给大家,让大家在开发的路上少走些弯路。

首先我尝试用安卓辅助功能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"位置如下,写安卓的应该都可以明白

        为了解决这个错误,我按照网上说的方法进行,使用安卓签名工具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命令控制你的手机了。

我在此就简单介绍一些命令,要想详细了解的去下面两篇博客

自己动手开发精简版按键精灵

Android模拟屏幕点击事件

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3