Android中三種注入事件方法比較
方法1:使用內(nèi)部APIs
該方法和其他所有內(nèi)部沒(méi)有向外正式公布的APIs一樣存在它自己的風(fēng)險(xiǎn)。原理是通過(guò)獲得WindowManager的一個(gè)實(shí)例來(lái)訪(fǎng)問(wèn)injectKeyEvent/injectPointerEvent這兩個(gè)事件注入方法。
IBinder wmbinder = ServiceManager.getService( "window" );
IWindowManager m_WndManager = IWindowManager.Stub.asInterface( wmbinder );
ServiceManager和Windowsmanager被定義為存根Stubs類(lèi)。我們根據(jù)我們的需要綁定上這些服務(wù)并訪(fǎng)問(wèn)里面的方法。 To send a key do the following: 通過(guò)以下方式發(fā)送一個(gè)事件:
// 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事件,你將會(huì)得到一個(gè)強(qiáng)制關(guān)閉的消息:

方法2: 使用instrumentation對(duì)象
相對(duì)以上的隱藏接口和方法,這個(gè)是比較干凈(上面的是隱藏的,故需要用到android不干凈不推薦的方法去獲?。┑姆绞?,但不幸的事它依然有上面的JINECT_EVENTS這個(gè)只有系統(tǒng)應(yīng)用(基本上就是android自己提供的,如monkey)才被允許的權(quán)限問(wè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)操作的話(huà)完全沒(méi)有問(wèn)題,但一旦跳出這個(gè)應(yīng)用去觸發(fā)按鍵事件的話(huà)就會(huì)崩潰。不是因?yàn)檫@個(gè)方法不工作,而是因?yàn)閍ndroid開(kāi)發(fā)人員做了限制。謝謝你們,android的開(kāi)發(fā)者們,你牛逼!個(gè)屁。
通過(guò)分析sendPointerSync的對(duì)應(yīng)代碼,可以看到其實(shí)instrumentation使用到的注入事件方式其實(shí)和方法一提到的通過(guò)WindowManager.injectPointerEvents是一樣的,所以穿的都是同一條內(nèi)褲,只是Robotium出來(lái)走動(dòng)的時(shí)候套上條時(shí)尚喇叭褲,而以上直接調(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è)備的方式向用戶(hù)暴露了一套統(tǒng)一的事件注入接口/dev/input/eventX(其中X代表一個(gè)整數(shù))。我們可以直接跳用而跳過(guò)以上的平臺(tái)(android這個(gè)機(jī)遇linux的平臺(tái))限制問(wèn)題。但是這需要工作的話(huà),你需要rooted過(guò)的設(shè)備。
設(shè)備文件eventX默認(rèn)是被設(shè)置為660這個(gè)權(quán)限的(Owner和同組成員有讀寫(xiě),而owner是root)。為了向這個(gè)設(shè)備注入事件,你必須讓它能可寫(xiě)。所以請(qǐng)先做以下動(dòng)作:

adb shell
su
chmod 666 /dev/input/event3
你將需要root權(quán)限來(lái)運(yùn)行chmod命令。
- 淺析Android 模擬鍵盤(pán)鼠標(biāo)事件
- Android編程實(shí)現(xiàn)監(jiān)控apk安裝,卸載,替換的方法
- Android編程實(shí)現(xiàn)監(jiān)控各個(gè)程序流量的方法
- android監(jiān)控sim卡有沒(méi)有服務(wù)示例(sim卡管理)
- android Textview文字監(jiān)控(Textview使用方法)
- Android中判斷網(wǎng)絡(luò)連接是否可用及監(jiān)控網(wǎng)絡(luò)狀態(tài)
- Android按鈕單擊事件的四種常用寫(xiě)法總結(jié)
- Android中實(shí)現(xiàn)監(jiān)聽(tīng)ScrollView滑動(dòng)事件
- Android中button實(shí)現(xiàn)onclicklistener事件的兩種方式
- Android Touch事件分發(fā)過(guò)程詳解
- android 鍵盤(pán)事件和屏幕事件的運(yùn)行原理及交互實(shí)現(xiàn)
- android監(jiān)聽(tīng)返回按鈕事件的方法
- 封裝的android監(jiān)聽(tīng)手指左右滑動(dòng)屏幕的事件類(lèi)分享
- Android基于hover組件實(shí)現(xiàn)監(jiān)控鼠標(biāo)移動(dòng)事件的方法
相關(guān)文章
Android?studio開(kāi)發(fā)實(shí)現(xiàn)計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了Android?studio開(kāi)發(fā)實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
使用PlatformView將?Android?控件view制作成Flutter插件
這篇文章主要為大家介紹了使用PlatformView將?Android?控件view制作成Flutter插件實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Android獲取系統(tǒng)儲(chǔ)存以及內(nèi)存信息的方法(二)
android開(kāi)發(fā)中獲取手機(jī)分辨率大小的方法
Android序列化實(shí)現(xiàn)接口Serializable與Parcelable詳解
Android實(shí)現(xiàn)圖片隨手指旋轉(zhuǎn)功能

