Android随笔之——模拟按键操作的几种方式

  前几天转过一篇Android上模拟按键操作、触屏事件的博客,昨天又去找了百度、谷歌了一下,写了一点简单的测试代码,留待不时之需。有需要看之前转载的那篇博客的请看这里→_→转:Android随笔之——使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵),这里我就直接上代码了。

  

 1 package com.lsj.keyboardsample;
 2 
 3 import android.app.Activity;
 4 import android.app.Instrumentation;
 5 import android.os.Bundle;
 6 import android.view.KeyEvent;
 7 
 8 public class MainActivity extends Activity {
 9 
10     @Override
11     protected void onCreate(Bundle savedInstanceState) {
12         super.onCreate(savedInstanceState);
13         setContentView(R.layout.activity_main);
14         // sendKeyCode1(KeyEvent.KEYCODE_MEDIA_STOP);
15         sendKeyCode2(KeyEvent.KEYCODE_VOLUME_DOWN);
16     }
17 
18     /**
19      * 用Runtime模拟按键操作
20      * 
21      * @param keyCode
22      *            按键事件(KeyEvent)的按键值
23      */
24     private void sendKeyCode1(int keyCode) {
25         try {
26             // 按键操作命令 11.24勘误,之前错误的写成了"input keycode"
27             String keyCommand = "input keycode " + keyCode;
28             // 调用Runtime模拟按键操作
29             Runtime.getRuntime().exec(keyCommand);
30         } catch (Exception e) {
31             e.printStackTrace();
32         }
33     }
34 
35     /**
36      * <pre>
37      * 使用Instrumentation接口:对于非自行编译的安卓系统,无法获取系统签名,只能在前台模拟按键,不能后台模拟
38      * 注意:调用Instrumentation的sendKeyDownUpSync方法必须另起一个线程,否则无效
39      * @param keyCode
40      *            按键事件(KeyEvent)的按键值
41      * </pre>
42      */
43     private void sendKeyCode2(final int keyCode) {
44         new Thread(new Runnable() {
45             @Override
46             public void run() {
47                 try {
48                     // 创建一个Instrumentation对象
49                     Instrumentation inst = new Instrumentation();
50                     // 调用inst对象的按键模拟方法
51                     inst.sendKeyDownUpSync(keyCode);
52                 } catch (Exception e) {
53                     e.printStackTrace();
54                 }
55             }
56         }).start();
57     }
58     
59     /**
60      * <pre>
61      * 此方法使用反射调用系统IWindowManager隐藏API:兼容性较差,稳定性不好,容易出错。另外实际编译时发生错误,原因暂时不明。
62      * 暂时还未掌握Java的反射机制,留待以后测试
63      * @param keyCode
64      * </pre>
65      */
66     private void sendKeyCode3(int keyCode) {
67         /*此方法中那个的IWindowManager是不存在的,需要使用Java的反射机制才能实现*/
68         /**
69         final int keyCode = key;
70         Thread sendKeyDelay = new Thread(){
71             public void run() {
72                 try {
73                     Thread.sleep(100);
74                     
75                     long now = SystemClock.uptimeMillis();
76                     KeyEvent keyDown = new KeyEvent(now, now, KeyEvent.ACTION_DOWN,
77                             keyCode, 0);
78                     IWindowManager wm = IWindowManager.Stub.asInterface(
79                             ServiceManager.getService("window"));
80                     wm.injectKeyEvent(keyDown, false);
81                     
82                     KeyEvent keyUp = new KeyEvent(now, now, KeyEvent.ACTION_UP,
83                             keyCode, 0);
84                     wm.injectKeyEvent(keyUp, false);
85                 } catch (InterruptedException e) {
86                     e.printStackTrace();
87                 } catch (RemoteException e) {
88                     e.printStackTrace();
89                 }
90             }
91         };
92         sendKeyDelay.start();
93          */
94     }
95 
96 }

作者:登天路

转载请说明出处:http://www.cnblogs.com/travellife/

原文地址:https://www.cnblogs.com/travellife/p/4107434.html