zoukankan      html  css  js  c++  java
  • Android sendevent/getevent 用法

    前言:最近在弄一个模拟用户点击屏幕的功能,并且不需要用户点击屏幕,后台自动给输入框赋值,类似pc端按键精灵的功能,在网上找了很多人的资料,写的都不是太详细,一知半解.还要自己慢慢研究.于是我这边写一篇博客整理出来,并且附上demo下载.


    这两个命令的源码在system/core/toolbox/下,sendevent.c getevent.c    使用这两个命令的前提是手机获取了root权限. 


    getevent可以获取用户的点击事件.

    1).在cmd窗口中输入命令:adb shell getevent    (输入adb命令的时候一定要配置android sdk环境变量)

    2).点击我们app的确定按钮.就会获取设备汇报的事件.


    3).我们可以看到点击一个按钮产生了12行信息,代表12个事件.  我来解释第一行信息: [设备名称] [类型] [code] [value]

         有哪些类型请参考博客:http://blog.csdn.net/kickxxx/article/details/7482392

    /dev/input/event7: 0001 014a 00000001
    /dev/input/event7: 0003 003a 00000001
    /dev/input/event7: 0003 0035 00000172
    /dev/input/event7: 0003 0036 00000129
    /dev/input/event7: 0000 0002 00000000
    /dev/input/event7: 0000 0000 00000000
    /dev/input/event7: 0001 014a 00000000
    /dev/input/event7: 0003 003a 00000000
    /dev/input/event7: 0003 0035 00000172
    /dev/input/event7: 0003 0036 00000129
    /dev/input/event7: 0000 0002 00000000
    /dev/input/event7: 0000 0000 00000000

    sendEvent事件的使用

    1).我们用getEvent获取的值是16进制的,而sendEvent输入的值是10进制的,我这里把这些值转换了,并且增加了前缀"adb shell sendevent".

    adb shell sendevent /dev/input/event7 0001 330 00000001
    adb shell sendevent /dev/input/event7 0003 58  00000001
    adb shell sendevent /dev/input/event7 0003 0053 00000370
    adb shell sendevent /dev/input/event7 0003 0054 00000297
    adb shell sendevent /dev/input/event7 0000 0002 00000000
    adb shell sendevent /dev/input/event7 0000 0000 00000000
    adb shell sendevent /dev/input/event7 0001 0330 00000000
    adb shell sendevent /dev/input/event7 0003 0058 00000000
    adb shell sendevent /dev/input/event7 0003 0053 00000370
    adb shell sendevent /dev/input/event7 0003 0054 00000297
    adb shell sendevent /dev/input/event7 0000 0002 00000000
    adb shell sendevent /dev/input/event7 0000 0000 00000000

    2).我们看到上面最后面一栏中有370跟297两个数,这是是点击的坐标在屏幕的位置.如果我们用点击事件,只需要改变这两个值就可.

    3).把这些命令复制到粘贴板,我们输入这些命令,效果图如下:

        

       

    这里讲解了sendevent跟getevent的使用,如果我们要给输入框输入值,只需要一条命令就行.   adb shell input text 'ansen'

    还有一些其他命令,参考博客:http://blog.sina.com.cn/s/blog_76550fd70101j2zs.html




    接下来看代码如何实现这个功能.我们在android程序中可以执行shell命令.再次提醒需要root权限.我这边是软件启动延时三秒,执行点击事件点击输入框,然后给EditText赋值.

    public class MainActivity extends Activity {
    	public final static String CLIECK_INPUT="" +
    			  "sendevent /dev/input/event7 0001 330 00000001 
     " +
    			  "sendevent /dev/input/event7 0003 58 00000001 
    " +
    			  "sendevent /dev/input/event7 0003 53 00000159 
    " +
    			  "sendevent /dev/input/event7 0003 54 00000186 
    " +
    			  "sendevent /dev/input/event7 0000 0002 00000000 
    " +
    			  "sendevent /dev/input/event7 0000 0000 00000000 
    " +
    			  "sendevent /dev/input/event7 0001 330 00000000 
    " +
    			  "sendevent /dev/input/event7 0003 58 00000000 
    " +
    			  "sendevent /dev/input/event7 0003 53 00000159 
    " +
    			  "sendevent /dev/input/event7 0003 54 00000186 
    " +
    			  "sendevent /dev/input/event7 0000 0002 00000000 
    " +
    			  "sendevent /dev/input/event7 0000 0000 00000000 
     sleep 2 m 
    " +
    			  " ";
    	
    	
    	private Handler handler=new Handler(){
    		public void handleMessage(android.os.Message msg) {
    			
    		};
    	};
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		findViewById(R.id.confirm).setOnClickListener(clickListener);
    		
    		handler.postDelayed(new Runnable() {
    			@Override
    			public void run() {
    				execShell(CLIECK_INPUT);
    				execShell("input text  'ansen'");
    			}
    		}, 3000);
    	}
    	
    	private OnClickListener clickListener=new OnClickListener() {
    		@Override
    		public void onClick(View v) {
    			Toast.makeText(MainActivity.this, "点击了确定按钮", 0).show();
    		}
    	};
    	
    	public void execShell(String cmd) {
    		try {
    			Toast.makeText(MainActivity.this,"执行shell命令", 0).show();
    			// 权限设置
    			Process p = Runtime.getRuntime().exec("su");
    			// 获取输出流
    			OutputStream outputStream = p.getOutputStream();
    			DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
    			// 将命令写入
    			dataOutputStream.writeBytes(cmd);
    			// 提交命令
    			dataOutputStream.flush();
    			// 关闭流操作
    			dataOutputStream.close();
    			outputStream.close();
    		} catch (Throwable t) {
    			t.printStackTrace();
    		}
    	}
    }

    运行效果图如下:



    点击下载源码

  • 相关阅读:
    查找小岛个数
    非递归遍历树的总结(前中后序)
    Java的TreeMap,C++的lower_bound,合并间隔
    最多包含2/k个不同字符的最长串
    爆气球这道题目,展开了新的思路
    C++的hashmap和Java的hashmap
    求数组里重复出现的数字
    数组中出现一次的两个数(三个数)& 求最后一位bit为1
    皇后问题的经典做法
    海外省电应用市场:本土化为先锋,高技术为基础
  • 原文地址:https://www.cnblogs.com/yishaochu/p/5078599.html
Copyright © 2011-2022 走看看