1. 程式人生 > >Android隨筆之——模擬按鍵操作的幾種方式

Android隨筆之——模擬按鍵操作的幾種方式

 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 }