Android 【真機】與【模擬器】觸控螢幕事件的類比差異分析

來源:互聯網
上載者:User

     Android 真機和模擬器的差異問題,是永恒的話題,問不完的為什麼,解不完的迷。模擬器的存在,有它的作用,但不要什麼都相信模擬器。除非你是Android純上層應用開發人員或者愛好者,否則我建議你扔掉模擬器。它理想化的引導給我們添了不少麻煩。當然,這也是件好事。最起碼,讓我有興趣去尋求答案,讓我收穫了更多。

      問題的緣由是有個自動化測試的需求,我需要寫指令碼類比點擊觸控螢幕的一系列操作,以代替手工測試(話說~遇上連續啟動1000次camera並且拍照後退出這種變態測試,你們都是怎麼做的?)。以此來證明:頭兒,此bug真的解了!

     

    

     Linux上可以通過sendEvent來類比鍵盤或者滑鼠點擊事件,而Android是基於Linux2.6的,所以也可以類比點擊事件。網路文章很多都給出這樣一段資料資訊,告訴你怎麼去實現類比點擊:

adb shell sendevent /dev/input/event0 3 0 110       //x座標
adb shell sendevent /dev/input/event0 3 1 70         //y座標
adb shell sendevent /dev/input/event0 1 330 1       //按下狀態,準確的說是有壓力值
adb shell sendevent /dev/input/event0 0 0 0           //必要的一行資料
adb shell sendevent /dev/input/event0 1 330 0       //抬起狀態,無壓力值
adb shell sendevent /dev/input/event0 0 0 0           //必要的一行,相當於終止一段完整資料的標緻

 

 

用上面的方法可以點擊模擬器的(110,70)點,但是,在真機上,卻不可以,原因有兩點。

    
 ✿ 1.  /dev/input/event0 ×

      模擬器上只有一個/dev/input/event0,但是真機上不是(如果還真是,那你這裝置還是別出廠了-_-||)。

 

用cat獲得的裝置對應event資訊:

# cat /proc/bus/input/devices

I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="qtouch-touchscreen"
P: Phys=
S: Sysfs=/devices/virtual/input/input5
U: Uniq=
H: Handlers=event5
B: EV=b
B: KEY=400 0 4 0 0 0 0 0 0 0 0
B: ABS=2750000 11030003

"qtouch-touchscreen"不是規定死的event幾,話說1234567都有可能,看你裝置了。

 

 ✿ 2.  資料類型 ×

      探究原因的時候,通過:

#adb shell getevent /dev/input/event5 > getvalue

 

可以得到:

 0003 0035 000007c8
 0003 0036 00000771
 0003 0038 00000001
 0000 0002 00000000
 0003 0037 00000010
 0000 0000 00000000

 

這和我之前所想象的座標資訊不一樣,看到c,就知道是16進位數嘍,第一反應就是做個10進位的轉換。具體怎麼轉換?

int main (int argc, char *argv[]) 點點點... (這個.c 還不會寫?不會寫還不會搜嗎?)

可以得到:

3 53 1992 
3 54 1905
3 56 1
0 2 0 
3 55 16

0 0 0

 

先不管為什麼,做個測實驗證下結果:

adb shell sendevent /dev/input/event5 3 53 1992
adb shell sendevent /dev/input/event5 3 54 1905
adb shell sendevent /dev/input/event5 3 56 1
adb shell sendevent /dev/input/event5 0 2 0
adb shell sendevent /dev/input/event5 3 55 16
adb shell sendevent /dev/input/event5 0 0 0

 

這裡提一下,倘若操作的資料特別大,那我們可以利用vi的強大,在指令碼中實現批量資料的轉換,例如:

vim '+%normal gg' '+.,$g/^/s//adb shell sendevent //dev//input//event5 /g' '+wq' value

 

結果可以實現點擊

 

既然測試的結果證明那亂七八糟的數是對的,那就必究其緣由!其實問題的根本原因,是因為手裡的真機裝置已經支援了多點觸摸。

在Android中,多點觸摸功能依賴於RawInputEvent.java 中定義的以下幾個主要的軟體位:

public class RawInputEvent { </p><p>...<br /> public static final int ABS_MT_TOUCH_MAJOR = 0x30; </p><p> public static final int ABS_MT_TOUCH_MINOR = 0x31; </p><p> public static final int ABS_MT_WIDTH_MAJOR = 0x32; </p><p> public static final int ABS_MT_WIDTH_MINOR = 0x33; </p><p> public static final int ABS_MT_ORIENTATION = 0x34; </p><p> public static final int ABS_MT_POSITION_X = 0x35; </p><p> public static final int ABS_MT_POSITION_Y = 0x36; </p><p> public static final int ABS_MT_TOOL_TYPE = 0x37; </p><p> public static final int ABS_MT_BLOB_ID = 0x38; </p><p>...<br />}

在 KeyInputQueue.java 中,系統建立了一個線程,把所有的 Input 事件放入一個隊列,在 KeyInputQueue.java 的最後,將多時間點事件類型轉化為單時間點事件類型,返回一個新的 InputDevice。

 

   1點多了,先睡覺去了……

作者:yiyaaixuexi 發表於2011-6-29 1:21:00 原文連結 閱讀:3887 評論:20 查看評論

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.