最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

方法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è)事件注入方法。

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

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è)事件:
復(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事件,你將會(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)題。

復(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)操作的話(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ū)別而已。

復(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è)備的方式向用戶(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)作:

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

adb shell
su
chmod 666 /dev/input/event3

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

相關(guān)文章

  • Android獲取系統(tǒng)儲(chǔ)存以及內(nèi)存信息的方法(二)

    Android獲取系統(tǒng)儲(chǔ)存以及內(nèi)存信息的方法(二)

    這篇文章主要為大家詳細(xì)介紹了Android獲取系統(tǒng)儲(chǔ)存以及內(nèi)存信息的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • android開(kāi)發(fā)中獲取手機(jī)分辨率大小的方法

    android開(kāi)發(fā)中獲取手機(jī)分辨率大小的方法

    不管是在我們的布局還是在實(shí)現(xiàn)代碼中進(jìn)行操控,我們的靈活性都不是局限于一個(gè)固定的數(shù)值,而是面對(duì)不同的手機(jī)對(duì)象都有一個(gè)適應(yīng)的數(shù)值。
    2013-04-04
  • Android序列化實(shí)現(xiàn)接口Serializable與Parcelable詳解

    Android序列化實(shí)現(xiàn)接口Serializable與Parcelable詳解

    我們使用 Intent 傳遞數(shù)據(jù)的時(shí)候,putExtra() 所支持的數(shù)據(jù)類(lèi)型事有限的,當(dāng)需要傳遞自定義對(duì)象的時(shí)候就需要序列化。Serializable更簡(jiǎn)單但是會(huì)把整個(gè)對(duì)象進(jìn)行序列化因此效率比Parcelable低一些
    2022-12-12
  • Android實(shí)現(xiàn)圖片隨手指旋轉(zhuǎn)功能

    Android實(shí)現(xiàn)圖片隨手指旋轉(zhuǎn)功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圖片隨手指旋轉(zhuǎn)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android實(shí)現(xiàn)圖片緩存與異步加載

    Android實(shí)現(xiàn)圖片緩存與異步加載

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圖片緩存與異步加載的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • Android視圖的繪制流程(上) View的測(cè)量

    Android視圖的繪制流程(上) View的測(cè)量

    這篇文章主要為大家詳細(xì)介紹了Android視圖的繪制流程上篇,View測(cè)量的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Android自定義荷載進(jìn)度的兩種方法

    Android自定義荷載進(jìn)度的兩種方法

    進(jìn)度條在App中非常常見(jiàn),例如下載進(jìn)度、加載圖片、打開(kāi)文章、打開(kāi)網(wǎng)頁(yè)等等……本篇文章主要介紹了Android自定義荷載進(jìn)度的兩種方法,有需要的朋友可以了解一下。
    2016-10-10
  • 最新評(píng)論

    保亭| 读书| 白城市| 聊城市| 特克斯县| 高雄县| 南和县| 东平县| 长治县| 二连浩特市| 县级市| 永胜县| 庆云县| 栾城县| 洪湖市| 健康| 谷城县| 台东市| 建阳市| 灯塔市| 邵阳市| 乐东| 横峰县| 芮城县| 仙桃市| 日土县| 和平区| 同江市| 广州市| 武胜县| 湟中县| 集安市| 蒙阴县| 桂东县| 安化县| 张家界市| 瑞丽市| 普兰县| 中西区| 宝坻区| 博野县|