前幾天轉過一篇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 }
作者:登天路