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 }
作者:登天路