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/

你可能感兴趣的:(android)