Android中三種注入事件方法比較
方法1:使用內(nèi)部APIs
該方法和其他所有內(nèi)部沒有向外正式公布的APIs一樣存在它自己的風(fēng)險。原理是通過獲得WindowManager的一個實(shí)例來訪問injectKeyEvent/injectPointerEvent這兩個事件注入方法。
IBinder wmbinder = ServiceManager.getService( "window" );
IWindowManager m_WndManager = IWindowManager.Stub.asInterface( wmbinder );
ServiceManager和Windowsmanager被定義為存根Stubs類。我們根據(jù)我們的需要綁定上這些服務(wù)并訪問里面的方法。 To send a key do the following: 通過以下方式發(fā)送一個事件:
// key down
m_WndManager.injectKeyEvent( new KeyEvent( KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A ),true );
// key up
m_WndManager.injectKeyEvent( new KeyEvent( KeyEvent.ACTION_UP, KeyEvent.KEYCODE_A ),true );
發(fā)送touch/mouse事件:
//pozx goes from 0 to SCREEN WIDTH , pozy goes from 0 to SCREEN HEIGHT
m_WndManager.injectPointerEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),MotionEvent.ACTION_DOWN,pozx, pozy, 0), true);
m_WndManager.injectPointerEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),MotionEvent.ACTION_UP,pozx, pozy, 0), true);
這種方法能在你的應(yīng)用中很好的工作,但,也僅僅只能在你的應(yīng)用中而已
一旦你想要往其他窗口注入keys/touch事件,你將會得到一個強(qiáng)制關(guān)閉的消息:
方法2: 使用instrumentation對象
相對以上的隱藏接口和方法,這個是比較干凈(上面的是隱藏的,故需要用到android不干凈不推薦的方法去獲?。┑姆绞剑恍业氖滤廊挥猩厦娴腏INECT_EVENTS這個只有系統(tǒng)應(yīng)用(基本上就是android自己提供的,如monkey)才被允許的權(quán)限問題。
Instrumentation m_Instrumentation = new Instrumentation();
m_Instrumentation.sendKeyDownUpSync( KeyEvent.KEYCODE_B );
以下是觸摸事件實(shí)例:
//pozx goes from 0 to SCREEN WIDTH , pozy goes from 0 to SCREEN HEIGHT
m_Instrumentation.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),MotionEvent.ACTION_DOWN,pozx, pozy, 0);
m_Instrumentation.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),MotionEvent.ACTION_UP,pozx, pozy, 0);
在應(yīng)用內(nèi)操作的話完全沒有問題,但一旦跳出這個應(yīng)用去觸發(fā)按鍵事件的話就會崩潰。不是因?yàn)檫@個方法不工作,而是因?yàn)閍ndroid開發(fā)人員做了限制。謝謝你們,android的開發(fā)者們,你牛逼!個屁。
通過分析sendPointerSync的對應(yīng)代碼,可以看到其實(shí)instrumentation使用到的注入事件方式其實(shí)和方法一提到的通過WindowManager.injectPointerEvents是一樣的,所以穿的都是同一條內(nèi)褲,只是Robotium出來走動的時候套上條時尚喇叭褲,而以上直接調(diào)用WindowManager的方式就猶如只穿一條內(nèi)褲出街的區(qū)別而已。
public void sendPointerSync(MotionEvent event) {
validateNotAppThread();
try {
(IWindowManager.Stub.asInterface(ServiceManager.getService("window")))
.injectPointerEvent(event, true);
} catch (RemoteException e) {
}
}
方法3:直接注入事件到設(shè)備/dev/input/eventX
linux以系統(tǒng)設(shè)備的方式向用戶暴露了一套統(tǒng)一的事件注入接口/dev/input/eventX(其中X代表一個整數(shù))。我們可以直接跳用而跳過以上的平臺(android這個機(jī)遇linux的平臺)限制問題。但是這需要工作的話,你需要rooted過的設(shè)備。
設(shè)備文件eventX默認(rèn)是被設(shè)置為660這個權(quán)限的(Owner和同組成員有讀寫,而owner是root)。為了向這個設(shè)備注入事件,你必須讓它能可寫。所以請先做以下動作:
adb shell
su
chmod 666 /dev/input/event3
你將需要root權(quán)限來運(yùn)行chmod命令。
- 淺析Android 模擬鍵盤鼠標(biāo)事件
- Android編程實(shí)現(xiàn)監(jiān)控apk安裝,卸載,替換的方法
- Android編程實(shí)現(xiàn)監(jiān)控各個程序流量的方法
- android監(jiān)控sim卡有沒有服務(wù)示例(sim卡管理)
- android Textview文字監(jiān)控(Textview使用方法)
- Android中判斷網(wǎng)絡(luò)連接是否可用及監(jiān)控網(wǎng)絡(luò)狀態(tài)
- Android按鈕單擊事件的四種常用寫法總結(jié)
- Android中實(shí)現(xiàn)監(jiān)聽ScrollView滑動事件
- Android中button實(shí)現(xiàn)onclicklistener事件的兩種方式
- Android Touch事件分發(fā)過程詳解
- android 鍵盤事件和屏幕事件的運(yùn)行原理及交互實(shí)現(xiàn)
- android監(jiān)聽返回按鈕事件的方法
- 封裝的android監(jiān)聽手指左右滑動屏幕的事件類分享
- Android基于hover組件實(shí)現(xiàn)監(jiān)控鼠標(biāo)移動事件的方法
相關(guān)文章
android實(shí)現(xiàn)Splash閃屏效果示例
這篇文章主要介紹了android實(shí)現(xiàn)Splash閃屏效果的方法,涉及Android中postDelayed方法及AndroidManifest.xml權(quán)限控制的相關(guān)使用技巧,需要的朋友可以參考下2016-08-08詳解Android中的NestedScrolling機(jī)制帶你玩轉(zhuǎn)嵌套滑動
這篇文章主要給大家詳細(xì)解析了Android中的NestedScrolling機(jī)制,通過介紹該機(jī)制帶你玩轉(zhuǎn)Android中的嵌套滑動效果,文中給出了詳細(xì)的示例代碼和介紹,需要的朋友們可以參考學(xué)習(xí),下面來一起看看吧。2017-05-05Android如何使用RecyclerView打造首頁輪播圖
這篇文章主要為大家詳細(xì)介紹了Android如何使用RecyclerView打造首頁輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02OKhttp攔截器實(shí)現(xiàn)實(shí)踐環(huán)節(jié)源碼解析
這篇文章主要為大家介紹了OKhttp攔截器實(shí)現(xiàn)實(shí)踐環(huán)節(jié)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Android使用ViewDragHelper實(shí)現(xiàn)QQ聊天氣泡拖動效果
這篇文章主要為大家詳細(xì)介紹了Android使用ViewDragHelper實(shí)現(xiàn)QQ聊天氣泡拖動效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01Android開發(fā)中MotionEvent坐標(biāo)獲取方法分析
這篇文章主要介紹了Android開發(fā)中MotionEvent坐標(biāo)獲取方法,結(jié)合實(shí)例形式分析了MotionEvent獲取坐標(biāo)的相關(guān)函數(shù)使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-02-02Android實(shí)現(xiàn)動態(tài)自動匹配輸入的內(nèi)容
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)動態(tài)自動匹配輸入的內(nèi)容,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-08-08