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             // 按键操作命令
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/

时间: 2024-08-11 01:34:32

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

C#驱动级模拟按键操作

C#驱动级模拟按键操作 2013-09-26 03:17 ·AB叔 447 3 <- 点击左侧的数字“攒”一个吧 昨天遇到一个程序自动输入财付通密码的任务. 因为财付通密码控件是有安全保护的,所以不能通过传统的Keybd_event来操作. 网上找了很多资料,终于找到winio.dll这个端口操作驱动程序组件来解决这个难题. 首先是需要用C#封装winio.dll,让它变得更加好用. 我这里已经封装好了SupKey.dll 注意,我的环境是win2003 32位,63位或者其他版本的时候可能需要

Android模拟点击的两种方式

导论 在Android中模拟一个点击事件有两种方式是通过模拟MotionEvent来实现:一种是通过ADB来实现 第一种:模拟MotionEvent 通用方法如下: private void setSimulateClick(View view, float x, float y) { long downTime = SystemClock.uptimeMillis(); final MotionEvent downEvent = MotionEvent.obtain(downTime, dow

android/IOS常用图片上传的两种方式

android/IOS常用图片上传的两种方式: 1.上传到服务器的文件服务器(FileServer) 原理:上传到文件服务器的方式是先在服务器端搭建文件服务器,配置好路径(url),该路径是我们待会上传图片的路径,配置成功后便通过http+post的模式上传到文件服务器,同时文件服务器将返回一个图片ID,这个ID就是图片的唯一标识,并将该ID写入数据库保存,当需要下载该图片时只需要将此ID带上即可. 两个核心问题: (1)服务端:配置FileServer,并写处理响应上传图片的代码,这个值得去网

【转】android创建Popwindow弹出菜单的两种方式

方法一的Activity [java] view plaincopy package com.app.test02; import android.app.Activity; import android.os.Bundle; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import

android里TextView加下划线的几种方式

如果是在资源文件里: <resources> <string name="hello"><u>phone:0123456</u></string> <string name="app_name">MyLink</string> </resources> 如果是代码里: TextView textView = (TextView)findViewById(R.id.tv_t

创建一对多表结构实例 /操作的三种方式

例 1.注册App01  完成各项配置 2. 写完后自动生成一个id自增列(主键) 如果不想生成 自己写 创建两张表 3.执行创建语句 (其中还进行了一个小修改) 4.按照之前的方法 打开数据库 并输入数据 5.修改表结构 法一: 在更新时 遇到选择 因为已经存入数据 新建列默认不能为Null 默认为sa 注意输入的是字符串 刷新 法二: 法三: ====================== 接下来进行view 应该先看到业务线  再看到主机 1.urls 注意:如果同时有 bussiness

[Android] Android ViewPager 中加载 Fragmenet的几种方式

Android ViewPager 中加载 Fragmenet的几种方式 1.当fragment里面的内容较少时,可以利用加载view 的方法来进行: private List<View> viewList; //在onCreate方法里面添加  viewList = new ArrayList<View>();        View view1 = View.inflate(this, R.layout.view1, null);        View view2 = Vie

[Android] Android ViewPager 中加载 Fragment的两种方式 方式(二)

接上文: https://www.cnblogs.com/wukong1688/p/10693338.html Android ViewPager 中加载 Fragmenet的两种方式 方式(一) 二.使用Fragment来填充ViewPager Google 官方是建议我们使用Fragment来填充ViewPager的,这样可以更加方便的生成每个Page以及管理 每个Page的生命周期!当然它给我们提供了两个不同的Adapter,他们分别是: FragmentPageAdapter和Fragm

Android Service与Activity之间通信的几种方式

在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activity中启动后台Service,通过Intent来启动,Intent中我们可以传递数据给Service,而当我们Service执行某些操作之后想要更新UI线程,我们应该怎么做呢?接下来我就介绍两种方式来实现Service与Activity之间的通信问题 通过Binder对象 当Activity通过调