Android 系統下模擬觸點擊的功能與權限


最近在研究手機與車載設備之間互聯的功能,有一些問題不是很清楚,特別 Android 的功能。所以分別在 WinCE 和 Android 的論壇發了一個帖子,希望可以得到大牛的指點。帖子鏈接如下:

WinCE:  WinCE 設備如何通過 USB 與 Android 手機互聯?

Android: Android 應用如何模擬觸屏點擊動作?

得到了大家的積極回復,很多問題有了一定的答案。雖然到目前為止,還沒有徹底的將技術問題搞通,但也差不了多少了!

 

通過 Instrumentation 來模擬屏幕點擊,在本應用的界面,不用增加如下的處理也可以正常響應。但本應用后台運行后,想控制其它的應用或系統應用時,出現權限不允許的錯誤。

在一台已經 ROOT 的設備上,且在 manifest 中增加了:

<uses-permission android:name="android.permission.INJECT_EVENTS" />  

調用如下函數,讓應用獲取 ROOT 的權限后,本應用后台運行后模擬屏幕點擊仍然出錯。

 1 public static boolean runRootCommand(String command) {  
 2     Process process = null;  
 3     DataOutputStream os = null;  
 4     try {  
 5         process = Runtime.getRuntime().exec("su");  
 6         os = new DataOutputStream(process.getOutputStream());  
 7         os.writeBytes(command + "\n");  
 8         os.writeBytes("exit\n");  
 9         os.flush();  
10         process.waitFor();  
11     } catch (Exception e) {  
12         Log.d(TAG,  "the device is not rooted,  error message: " + e.getMessage());  
13         return false;  
14     } finally {  
15         try {  
16             if (os != null) {  
17             os.close();  
18         }  
19         if(process != null) {  
20             process.destroy();  
21         }  
22         } catch (Exception e) {  
23             e.printStackTrace();  
24         }  
25     }  
26     return true;  
27 }  
1 09-29 09:36:18.424: E/AndroidRuntime(1872): FATAL EXCEPTION: Thread-12  
2 09-29 09:36:18.424: E/AndroidRuntime(1872): java.lang.SecurityException: Injecting to another application requires INJECT_EVENTS permission  
3 09-29 09:36:18.424: E/AndroidRuntime(1872):     at android.os.Parcel.readException(Parcel.java:1353)  
4 09-29 09:36:18.424: E/AndroidRuntime(1872):     at android.os.Parcel.readException(Parcel.java:1307)  
5 09-29 09:36:18.424: E/AndroidRuntime(1872):     at android.view.IWindowManager$Stub$Proxy.injectPointerEvent(IWindowManager.java:949)  
6 09-29 09:36:18.424: E/AndroidRuntime(1872):     at android.app.Instrumentation.sendPointerSync(Instrumentation.java:937)  
7 09-29 09:36:18.424: E/AndroidRuntime(1872):     at com.jia.leozhengfirstapp.SocketClient$SocketReceiveThread.run(SocketClient.java:439)  

1) 模擬屏幕點擊實現的方法一

 1 // 模擬屏幕點擊事件 - 只在 Activity 中有用  
 2 public void setMouseClick(){  
 3     MotionEvent evenDownt = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis() + 100,  
 4     MotionEvent.ACTION_DOWN, 100, 400, 0);  
 5   dispatchTouchEvent(evenDownt);  
 6   MotionEvent eventUp = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis() + 100,  
 7         MotionEvent.ACTION_UP, 100, 400, 0);  
 8   dispatchTouchEvent(eventUp);  
 9   evenDownt.recycle();  
10   eventUp.recycle();  
11 }  

2) 模擬屏幕點擊實現的方法二

1 // 可以不用在 Activity 中增加任何處理,各 Activity 都可以響應  
2 Instrumentation inst = new Instrumentation();  
3 inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),   
4     MotionEvent.ACTION_DOWN, 200, 500, 0));  
5 inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),   
6     MotionEvent.ACTION_UP, 200, 500, 0));  

解決此問題,看來只有一種途徑了: 獲取系統權限。按網上的描述,有以下兩種方法: 
(1) 在源碼中編譯(需要在 Linux 環境下執行)
(2) 手動添加系統簽名(較為麻煩,但不必進入 Linux 環境,在 Windows 環境下就能操作)
以上方法也是有缺陷的: 這樣生成的程序只有在原始的 Android 系統或者是自己編譯的系統中才可以用,因為這樣的系統才可以拿到platform.pk8和platform.x509.pem兩個文件。
要是別家公司做的 Android 上連安裝都安裝不了。
試試原始的 Android 中的 key 來簽名,程序在模擬器上運行 OK,不過放到 G3 上安裝直接提示:
"Package ... has no signatures that match those in shared user android.uid.system",這樣也是保護了系統的安全。

 

以前回復的內容:

(1)有人在回復中提到自動化測試工具,所以偶也了解了一下,在 WinCE 下可能無法實現,因為需要 ADB【可以移植折】。自動化測試可以使用 monkey 工具,monkey 工具運行時直接通過 ADB Shell 連接到設備或模擬器,並且產生一個用戶和系統事件的偽隨機流。相比較 monkeyrunner 工具是通過工作站通過 API 發送特定的命令和事件來控制設備或模擬器。 The monkey tool runs in an adb shell directly on the device or emulator and generates pseudo-random streams of user and system events. In comparison, the monkeyrunner tool controls devices and emulators from a workstation by sending specific commands and events from an API. 總的來說,monkey 主要應用在壓力和可靠性測試上,運行該命令可以隨機地向目標程序發送各種模擬鍵盤事件流,並且可以自己定義發送的次數,以此觀察被測應用程序的穩定性和可靠性,應用起來也比較簡單,記住那幾個命令就行了。而 monkeyrunner 呢,相比之下會強大一些,它主要可應用於功能測試,回歸測試,並且可以自定義測試擴展,靈活性較強,並且測試人員可以完全控制。

(2)鏡像技術相關的技術主要有:
蘋果(Apple)的AirPlay Mirroring
英特爾(Intel)的WiDi
AMD 的AWD 3.0
WiGig聯盟的WiGig
晶像(Silicon Image)的Ultra Gig(Wireless HD)
WHDI聯盟的無線數字家庭接口(WHDI)
汽車聯機聯盟(Car Connectivity Consortium)的MirrorLink
以及Miracast
除WiGig及UltraGig使用的是60GHz的頻段,其他的技術都是使用2.4GHz或5GHz的頻段,不同的技術也有不同的傳輸速率及影音格式的規范。
AirPlay Mirroring憑借着其iOS及Mac裝置的熱賣,在此技術領域占有一定的比例;
WiDi以內建於英特爾筆記本電腦平台上的優勢打入市場;WiGig技術的傳輸率可到達7Gbit/s,2013年初又與Wi-Fi聯盟合並,因此未來的發展值得關注。
WHDI 也由於其獨占性,須看制造商是否支持;Gig的傳輸率可到達28Gbit/s,不過該技術目前由晶像獨占,得看設備制造商是否願意采用;

MirrorLink主要的應用目標是在車載系統,並同時定義有線及無線的應用,由於是汽車聯機聯盟主推,因此比較有機會被車商所采用;
而Miracast由Wi-Fi聯盟提出,並基於既有的Wi-Fi技術,容易與現有的無線產品結合,因此開發廠商較多,特別是英特爾宣布WiDi3.5版將與Mircast兼容


免責聲明!

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



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