关闭

钱柜娱乐开户模拟点击屏幕,实现按键精灵点击屏幕功能

标签: 安卓辅助功能钱柜娱乐开户模拟点击屏幕adb shell实现按键精灵功能INJECT_EVENTS权限
10444人阅读 评论(3) 收藏 举报
分类:

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

首先我尝试用安卓辅助功能AccessibilityService类实现模拟屏幕点击,但是这个类只能找到页面的控件,然后对控件进行模拟点击,不能实现对屏幕的某个位置进行点击,这个方法失败后我就试了另一种Instrumentation方法,这种方法确实可以点击屏幕上任何位置,而且点击事件可以生效,但是退出程序就不能进行了,程序出现错误,提示没有INJECT_EVENTS权限,但是加入INJECT_EVENTS权限后,还是出错,查了一下资料,说可以在添加钱柜娱乐开户:sharedUserId="钱柜娱乐开户.uid.system"获取系统共享签名,但是加入后生成的APK无法安装的手机上。

使用Instrumentation方法点击手机屏幕的任何位置

import java.io.IOException;

import 钱柜娱乐开户.app.Instrumentation;
import 钱柜娱乐开户.os.SystemClock;
import 钱柜娱乐开户.util.Log;
import 钱柜娱乐开户.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权限

<uses-permission 钱柜娱乐开户:name="钱柜娱乐开户.permission.INJECT_EVENTS"/>
添加钱柜娱乐开户:sharedUserId="钱柜娱乐开户.uid.system"位置如下,写安卓的应该都可以明白

<manifest xmlns:钱柜娱乐开户="http://schemas.钱柜娱乐开户.com/apk/res/钱柜娱乐开户"
    package="com.example.clickservice"
    钱柜娱乐开户:versionCode="1"
    钱柜娱乐开户:versionName="1.0" 
    钱柜娱乐开户:sharedUserId="钱柜娱乐开户.uid.system"
    >

        为了解决这个错误,我按照网上说的方法进行,使用安卓签名工具SignApk.jar对编译的apk进行签名,签名后的APK还是无法安装在手机上,还有一种解决这问题的方法就是使用钱柜娱乐开户源码编译,相信这种方法会让大多数人无从下手,光将钱柜娱乐开户源码编译的环境搭配起来都不是一件容易的事,有兴趣的可以尝试一下这种方法,下面就步入我们今天要讲的主题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是钱柜娱乐开户系统下的一个工具,可以模拟多种按键和触屏操作,产生的是raw event,raw event经过event hub处理产生最终的gesture事件。getevent用于获取当前系统input设备的一些参数和实时事件的数据;sendevent用于发送input事件,这俩命令的作用就是相当于解放了手,可以通过命令直接调用Linux底层来控制手机,工具的源码位于钱柜娱乐开户 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挂在后台运行即可,到此模拟点击手机屏幕的功能就实现了







6
0
查看评论
发表评论
* 以上用户言论只代表其个人钱柜娱乐开户,不代表CSDN网站的钱柜娱乐开户或立场

钱柜娱乐开户通过代码模拟物理、屏幕点击事件

本文讲的是通过使用代码,可以控制手机的
  • mad1989
  • mad1989
  • 2014-07-25 11:57
  • 97234

钱柜娱乐开户模拟点击的四种方式

在钱柜娱乐开户中模拟一个点击事件有两种方式
  • x359981514
  • x359981514
  • 2014-08-18 20:29
  • 19187

钱柜娱乐开户开发——Accessibility机制实现模拟点击(微信自动抢红包实现)

1.何为Accessibility机制? 许多钱柜娱乐开户使用者因为各种情况导致他们要以不同的方式与手机交互。对于那些由于视力、听力或其它身体原因导致不能方便使用钱柜娱乐开户智能手机的用户,A...
  • SEU_Calvin
  • SEU_Calvin
  • 2016-07-14 20:46
  • 24338

钱柜娱乐开户开发——Accessibility机制实现模拟点击(微信自动抢红包实现)

1. 何为Accessibility机制许多钱柜娱乐开户使用者因为各种情况导致他们要以不同的方式与手机交互。对于那些由于视力、听力或其它身体原因导致不能方便使用钱柜娱乐开户智能手机的用户,Andr...
  • chaishen10000
  • chaishen10000
  • 2016-11-10 21:48
  • 1384

钱柜娱乐开户应用防止模拟点击,防范抢红包类似插件的方法

(转载)http://www.itdadao.com/articles/c15a291705p0.html 模拟点击原理,及如何防止模拟点击 所有实现模拟点击功能的应用,都是基...
  • zhuhai__yizhi
  • zhuhai__yizhi
  • 2017-07-26 15:58
  • 523

钱柜娱乐开户在任何地方模拟点击屏幕

要求:在钱柜娱乐开户上按像素位置进行模拟屏幕点击,无论前台程序是什么(类似于按键精灵)。解决方案:使用安卓中的linux命令行来进行模拟(可以完成目标但是不优雅)。前提知识: ADB中可以使用”ad...
  • hai29785
  • hai29785
  • 2016-10-09 18:16
  • 7043

谈钱柜娱乐开户模拟点击的价值和实现

 “Action!”,欢迎收看这期大型扯淡实用类技术节目,《小明讲故事》,大家好我是小明!今天的主题是如果孙膑、诸葛亮和曾国藩是程序员,会怎么实现钱柜娱乐开户模拟自动点击。此处可以有Andro...
  • dj0379
  • dj0379
  • 2016-07-26 16:39
  • 2549

钱柜娱乐开户 shell获取和模拟点击事件

1. 获取点击屏幕的坐标位置 通过 adb shell getevent 命令获得点击屏幕的位置坐标的方法: 第一步:计算比例 首先通过命令 adb shell g...
  • beyond702
  • beyond702
  • 2017-04-05 16:13
  • 1730

钱柜娱乐开户模拟发送点击的两种方式

在钱柜娱乐开户中模拟一个点击事件有两种方式是通过模拟MotionEvent来实现;一种是通过ADB来实现。 第一种:模拟MotionEvent private void setSimulat...
  • xiangyunwan
  • xiangyunwan
  • 2017-02-17 11:23
  • 553

钱柜娱乐开户代码模拟物理、屏幕点击事件

一、应用中模拟物理和屏幕点击事件例如,模拟对某个view的点击事件private void simulateClick(View view, float x, float y) { long ...
  • hp910315
  • hp910315
  • 2016-08-03 19:50
  • 6977
    个人资料
    • 访问:35382次
    • 积分:493
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:4篇
    • 译文:0篇
    • 评论:14条