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

摘要:
几天前,我转到了一个博客,该博客模拟了Android上的按键操作和触摸屏事件。昨天,我去了百度和谷歌,写了一段简单的测试代码,以备不时之需。如果你需要看之前转载的博客,请看这里→_ → 转向: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随笔之——模拟按键操作的几种方式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用a标签实现页面的定向跳转[转] Android自动测试之monkeyrunner工具(二)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JavaScript的事件对象中的特殊属性和方法(鼠标,键盘)

鼠标操作导致的事件对象中的特殊属性和方法 鼠标事件是 Web 上面最常用的一类事件,毕竟鼠标还是最主要的定位设备。那么通过事件对象可以获取到鼠标按钮信息和屏幕坐标获取等 鼠标按钮 只有在主鼠标按钮被单击时(常规一般是鼠标左键)才会触发 click 事件,因此检测按钮的信息并不是必要的 但对于 mousedown 和 mouseup 事件来说,则在其 eve...

Jquery页面中添加键盘按键事件,如ESC事件

$(document).keydown(function(event){ if(event.keyCode == 38 || event.keyCode == 104){ i--; if(i<=0){ i=0; }}else if (event.keyCode == 40 || event.keyCode == 98){ i++; if(i&g...

Unity3D 物体移动方法总结

1. 简介     在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。 2. 通过Transform组件移动物体     Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale)。 其实所有的移动都会导致position的改...

ADB 常用命令

查看连接设备   adb devices //显示设备列表   adb get-serialno //获取设备序列号 重启adb service   adb kill-server   adb start-server adb 获取root控制   adb root   adb remount //将system分区重新挂载为可读写分区 adb...

js监听键盘事件

用JS监听键盘按下事件(keydown event) 1、监听全局键盘按下事件,例如监听全局回车事件 1  $(document).keydown(function(event){ 2    if(event.keyCode == 13){ 3      alert('你按下了Enter'); 4    } 5  }); 2、监听某个组件键盘按下事件,例...

Winform下KeyDown,KeyPress,KeyUp事件的总结(转)

原文: http://www.cnblogs.com/xiashengwang/archive/2011/09/15/2578798.html 在winform程序中,经常会用到这几个事件用于控制数字输入,按键动作等操作,但一直没有完全弄清楚他们之间的区别和联系,到底什么时候用哪一个事件合适,闲暇无事,做了一个小小的总结,以免以后犯糊涂。 1) 这三个事件...