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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM