Android 一種通用的按鍵精靈的實現思路

轉載請註明出處:校酷網-大學生菁英創業平臺
實現按鍵精靈的思路主要有三種:

1.AccessibilityService輔助類,這個類是設計用來幫助殘障人士使用android 手機的,我們可以利用它實現按鍵精靈的部分功能,因爲利用這個類只能找到頁面的控件,然後對控件進行模擬點擊,不能實現對屏幕的某個位置進行點擊

2.Instrumentation方法,這種方法確實可以點擊屏幕上任何位置,而且點擊事件可以生效,但是退出程序就不能進行了,程序出現錯誤,提示沒有INJECT_EVENTS權限,在如今第三方Rom橫行的今天,幾乎不可能獲取到這個權限。

3.adb shell命令的方法,這種方法很通用,能在所有android設備上使用,缺點是需要手機需要root,程序需要獲取到root權限,才能實現點擊;

我們經常使用Android adb shell命令在電腦上查看與之相連的Android設備各種信息,今天我們選擇用adb shell 命令來實現一種最爲通用,兼容性最強的按鍵精靈;

windows端使用adb shell命令

1.win+R鍵打開cmd,輸入adb shell,會連接到當前與電腦連接的手機(如果你沒有配置adb 命令的環境變量,要cd 命令進入到 sdk 下的 platform—tools目錄 再輸入 adb shell命令)

image

2.gettevent /sendevent 獲取輸入設備事件信息

getevent用於獲取當前系統input設備的一些參數和實時事件的數據

sendevent用於發送input事件,用來模擬物理按鍵的點擊和屏幕任意位置的點擊

這倆命令的作用就是相當於解放了手,可以通過命令直接調用Linux底層來控制手機,工具的源碼位於Android SDK的system/core/toolbox下(sendevent.c getevent.c)

(1)輸入getevent -p 獲取當前Android 設備的信息

image可以看到輸出的信息相當複雜,我們梳理一下可以看到當前設備有5個 devive 設備, 其中每個設備下KEY(0001)、ABS(0003)、SYN(0000)等表示該設備所支持的事件類型:EV_SYN [0000] (同步事件),EV_KEY [0001] (按鍵事件),EV_ABS [0003] (絕對值事件), ** 從name:可以看出 這些輸入設備 有耳機孔,物理按鍵,gps ,屏幕輸入等, 我們真正需要的是name :“synaptics—rmi—ts” 這個屏幕輸入設備 如下圖:

image我們觀察上圖中的abs 信息 其中的 0035 和 0036兩項 max值 1080 *1926(注意:也許你的手機0035 0036 兩項的max信息是一個很大的值,不要擔心,你只要網上搜索一下你手機真實的分辨率信息,兩者分別相除就可以得到一個倍數,要記好這個倍數) 就是手機屏幕的分辨率信息,這兩項的信息相當重要,是我們接下來工作的基礎;

3.觀察點擊屏幕後getevent輸出的座標信息;

接下來點擊屏幕你會發現屏幕上滾動了十幾行復雜的數據,如下圖: image

無需擔心過多,我們只要觀察 ,第三列 0035 和 0036 分別對應的信息,這就是剛纔你點擊的屏幕所對應 16 進制的座標信息 0x3a5 和0x568(還記得上面的那個倍數嗎,如果上一步你得到的不是真實的分辨率信息,不要忘了,要除以那個倍數,纔是真實的16進制座標信息奧) ,這正是我們所需要的,這個座標正好對應着我手機上的瀏覽器圖標,也就是說,一會我們會實現模擬點擊啓動瀏覽器(你可以對應一個你想打開應用的圖標);

4.利用input 向設備發送模擬按鍵事件

input keyevent 發送鍵盤事件
用法說明:
adb shell input keyevent “value”
usage: input ... input text <string>  
input keyevent <key code number or name> input tap <x> <y>
input swipe <x1> <y1> <x2> <y2>
如上,input後可以跟很多參數, text相當於輸入內容,keyevent相當於手機物理或是屏幕按鍵  
tap相當於touch事件,swipe相當於滑動~~是不是很贊?
adb shell 輸入 input key event 3 你會發現退回了桌面,這個事件相當於手機的home鍵,怎麼樣是不是很酷?  
文章後面會附上詳細的事件對應信息
好了,回到正題,剛纔我們得到了點擊事件的 16 進制座標 0x3a5 和0x568,我們需要把他轉化成10進制(input tab 需要的是 10進制座標信息)爲 933 和 1384

adb shell命令輸入 input tap 933 1384 你會發現我們已經成功啓動了瀏覽器,到這裏我們已經可以再 windows 系統實現模擬點擊事件, 可是如何才能在代碼裏用呢,彆着急接着往下看:
在程序中引用adb shell命令

1.獲取root權限,發送input 鍵盤點擊事件:

需要先root你的手機

/** 

  • 執行shell命令 
  • @param cmd 
    */ private void execShellCmd(String cmd) { 

    try {  
    // 申請獲取root權限,這一步很重要,不然會沒有作用  
    Process process = Runtime.getRuntime().exec("su");  
    // 獲取輸出流  
    OutputStream outputStream = process.getOutputStream();  
    DataOutputStream dataOutputStream = new DataOutputStream(  
    outputStream);  
    dataOutputStream.writeBytes(cmd);  
    dataOutputStream.flush();  
    dataOutputStream.close();  
    outputStream.close();  
    } catch (Throwable t) {  
    t.printStackTrace();  
    }  
    }
    在需要執行的地方:

execShellCmd("input tap 933 184");
你可以把具體的邏輯卸載一個服務裏,可以輕鬆實現錄製腳本,運行點擊命令,至此,實現一個自己的按鍵精靈是不是很容易呢;

附表

附表:input keyevent所對應全部key值:

KEYCODE_MENU 1
KEYCODE_SOFT_RIGHT 2
KEYCODE_HOME 3
KEYCODE_BACK 4
KEYCODE_CALL 5
KEYCODE_ENDCALL 6
KEYCODE_0 7
KEYCODE_1 8
KEYCODE_2 9
KEYCODE_3 10
KEYCODE_4 11
KEYCODE_5 12
KEYCODE_6 13
KEYCODE_7 14
KEYCODE_8 15
KEYCODE_9 16
KEYCODE_STAR 17
KEYCODE_POUND 18
KEYCODE_DPAD_UP 19
KEYCODE_DPAD_DOWN 20
KEYCODE_DPAD_LEFT 21
KEYCODE_DPAD_RIGHT 22
KEYCODE_DPAD_CENTER 23
KEYCODE_VOLUME_UP 24
KEYCODE_VOLUME_DOWN 25
KEYCODE_POWER 26
KEYCODE_CAMERA 27
KEYCODE_CLEAR 28
KEYCODE_A 29
KEYCODE_B 30
KEYCODE_C 31
KEYCODE_D 32
KEYCODE_E 33
KEYCODE_F 34
KEYCODE_G 35
KEYCODE_H 36
KEYCODE_I 37
KEYCODE_J 38
KEYCODE_K 39
KEYCODE_L 40
KEYCODE_M 41
KEYCODE_N 42
KEYCODE_O 43
KEYCODE_P 44
KEYCODE_Q 45
KEYCODE_R 46
KEYCODE_S 47
KEYCODE_T 48
KEYCODE_U 49
KEYCODE_V 50
KEYCODE_W 51
KEYCODE_X 52
KEYCODE_Y 53
KEYCODE_Z 54
KEYCODE_COMMA 55
KEYCODE_PERIOD 56
KEYCODE_ALT_LEFT 57
KEYCODE_ALT_RIGHT 58
KEYCODE_SHIFT_LEFT 59
KEYCODE_SHIFT_RIGHT 60
KEYCODE_TAB 61
KEYCODE_SPACE 62
KEYCODE_SYM 63
KEYCODE_EXPLORER 64
KEYCODE_ENVELOPE 65
KEYCODE_ENTER 66
KEYCODE_DEL 67
KEYCODE_GRAVE 68
KEYCODE_MINUS 69
KEYCODE_EQUALS 70
KEYCODE_LEFT_BRACKET 71
KEYCODE_RIGHT_BRACKET 72
KEYCODE_BACKSLASH 73
KEYCODE_SEMICOLON 74
KEYCODE_APOSTROPHE 75
KEYCODE_SLASH 76
KEYCODE_AT 77
KEYCODE_NUM 78
KEYCODE_HEADSETHOOK 79
KEYCODE_FOCUS 80
KEYCODE_PLUS 81
KEYCODE_MENU 82
KEYCODE_NOTIFICATION 83
KEYCODE_SEARCH 84
TAG_LAST_KEYCODE 85

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章