欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android中三種注入事件方法比較

 更新時(shí)間:2015年02月26日 12:01:22   投稿:junjie  
這篇文章主要介紹了Android中三種注入事件方法比較,本文分別講解了使用內(nèi)部APIs、使用instrumentation對象、直接注入事件到設(shè)備/dev/input/eventX等3種方法,需要的朋友可以參考下

方法1:使用內(nèi)部APIs

該方法和其他所有內(nèi)部沒有向外正式公布的APIs一樣存在它自己的風(fēng)險(xiǎn)。原理是通過獲得WindowManager的一個(gè)實(shí)例來訪問injectKeyEvent/injectPointerEvent這兩個(gè)事件注入方法。

復(fù)制代碼 代碼如下:

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ā)送一個(gè)事件:
復(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事件:
復(fù)制代碼 代碼如下:

//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事件,你將會得到一個(gè)強(qiáng)制關(guān)閉的消息:

方法2: 使用instrumentation對象

  相對以上的隱藏接口和方法,這個(gè)是比較干凈(上面的是隱藏的,故需要用到android不干凈不推薦的方法去獲?。┑姆绞剑恍业氖滤廊挥猩厦娴腏INECT_EVENTS這個(gè)只有系統(tǒng)應(yīng)用(基本上就是android自己提供的,如monkey)才被允許的權(quán)限問題。

復(fù)制代碼 代碼如下:

Instrumentation m_Instrumentation = new Instrumentation();
m_Instrumentation.sendKeyDownUpSync( KeyEvent.KEYCODE_B );

以下是觸摸事件實(shí)例:
復(fù)制代碼 代碼如下:

//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)操作的話完全沒有問題,但一旦跳出這個(gè)應(yīng)用去觸發(fā)按鍵事件的話就會崩潰。不是因?yàn)檫@個(gè)方法不工作,而是因?yàn)閍ndroid開發(fā)人員做了限制。謝謝你們,android的開發(fā)者們,你牛逼!個(gè)屁。

  通過分析sendPointerSync的對應(yīng)代碼,可以看到其實(shí)instrumentation使用到的注入事件方式其實(shí)和方法一提到的通過WindowManager.injectPointerEvents是一樣的,所以穿的都是同一條內(nèi)褲,只是Robotium出來走動(dòng)的時(shí)候套上條時(shí)尚喇叭褲,而以上直接調(diào)用WindowManager的方式就猶如只穿一條內(nèi)褲出街的區(qū)別而已。

復(fù)制代碼 代碼如下:

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代表一個(gè)整數(shù))。我們可以直接跳用而跳過以上的平臺(android這個(gè)機(jī)遇linux的平臺)限制問題。但是這需要工作的話,你需要rooted過的設(shè)備。

設(shè)備文件eventX默認(rèn)是被設(shè)置為660這個(gè)權(quán)限的(Owner和同組成員有讀寫,而owner是root)。為了向這個(gè)設(shè)備注入事件,你必須讓它能可寫。所以請先做以下動(dòng)作:

復(fù)制代碼 代碼如下:

adb shell
su
chmod 666 /dev/input/event3

你將需要root權(quán)限來運(yùn)行chmod命令。

相關(guān)文章

最新評論