1. 程式人生 > >Android程式碼模擬物理、螢幕點選事件

Android程式碼模擬物理、螢幕點選事件

一、應用中模擬物理和螢幕點選事件

例如,模擬對某個view的點選事件

private void simulateClick(View view, float x, float y) {
    long downTime = SystemClock.uptimeMillis();
    final MotionEvent downEvent = MotionEvent.obtain(downTime, downTime,MotionEvent.ACTION_DOWN, x, y, 0);
    downTime += 1000;
    final MotionEvent upEvent = MotionEvent.obtain
(downTime, downTime,MotionEvent.ACTION_UP, x, y, 0); view.onTouchEvent(downEvent); view.onTouchEvent(upEvent); downEvent.recycle(); upEvent.recycle(); } public void setMouseClick(int x, int y){ MotionEvent evenDownt = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis
() + 100, MotionEvent.ACTION_DOWN, x, y, 0); dispatchTouchEvent(evenDownt); MotionEvent eventUp = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis() + 100, MotionEvent.ACTION_UP, x, y, 0); dispatchTouchEvent(eventUp); evenDownt.recycle(); eventUp.recycle
(); }

這實現原理就是模擬兩個MotionEvent (按下和提起) 然後用一個View 來處理這個Event 。

二、Instrumentation實現模擬鍵盤滑鼠事件

// 可以不用在 Activity 中增加任何處理,各 Activity 都可以響應  
Instrumentation inst = new Instrumentation();  
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),   
    MotionEvent.ACTION_DOWN, 200, 500, 0));  
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),   
    MotionEvent.ACTION_UP, 200, 500, 0));  

三、系統中模擬物理和螢幕點選事件

1、adb shell 進入手機命令列
2、getevent -h 用法說明

[email protected]:/ $ getevent -h  

Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]
    -t: show time stamps
    -n: don't print newlines
    -s: print switch states for given bits
    -S: print all switch states
    -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32, props=64)
    -d: show HID descriptor, if available
    -p: show possible events (errs, dev, name, pos. events)
    -i: show all device info and possible events
    -l: label event types and names in plain text
    -q: quiet (clear verbosity mask)
    -c: print given number of events then exit
    -r: print rate events are received

[-t] 引數顯示事件的時間戳
[-n] 取消事件顯示時的換行符
[-s switchmask] 得到指定位的開關狀態
[-S] 得到所有開關的狀態
[-v [mask]] 根據mask的值顯示相關資訊
[-p] 顯示每個裝置支援的事件型別和編碼
[-q] 只顯示事件資料
[-c count] 只顯示count次事件的資料
[-r] 顯示事件接收頻率

3、getevent -p 顯示出來當前系統存在的所有input裝置,並且把每個裝置支援的事件型別以及編碼

shell@hwH60:/ $ getevent -p

add device 1: /dev/input/event2
  name:     "hi6421_on"
  events:
    KEY (0001): 0074 
  input props:
    <none>
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 2: /dev/input/event4
  name:     "huawei,touchscreen"
  events:
    KEY (0001): 003b  003c  003d  003e  003f  0040  0041  0042 
                0043  0044  0057  00bd  00be  00bf  00c0  00c1 
                0145  014a 
    ABS (0003): 0000  : value 0, min 0, max 1079, fuzz 0, flat 0, resolution 0
                0001  : value 0, min 0, max 1919, fuzz 0, flat 0, resolution 0
                0018  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
                0030  : value 0, min 0, max 15, fuzz 0, flat 0, resolution 0
                0035  : value 0, min 0, max 1079, fuzz 0, flat 0, resolution 0
                0036  : value 0, min 0, max 1919, fuzz 0, flat 0, resolution 0
                0039  : value 0, min 0, max 15, fuzz 0, flat 0, resolution 0
                003a  : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
  input props:
    INPUT_PROP_DIRECT
add device 3: /dev/input/event0
  name:     "mhl_rcp_dev"
  events:
    KEY (0001): 0002  0003  0004  0005  0006  0007  0008  0009 
                000a  000b  000e  001c  0034  003b  003c  003d 
                003e  003f  0067  0069  006a  006c  0071  0072 
                0073  0077  0080  008b  009e  009f  00a1  00a4 
                00a5  00a7  00a8  00ae  00c8  00c9  00cf  00d0 
                00d5  00e8  0161  0163  0192  0193  019c 
  input props:
    <none>
could not get driver version for /dev/input/mice, Not a typewriter
add device 4: /dev/input/event1
  name:     "hisi_gpio_key.14"
  events:
    KEY (0001): 0072  0073 
  input props:
    <none>
add device 5: /dev/input/event3
  name:     "hi3630_hi6401_CARD Headset Jack"
  events:
    KEY (0001): 0072  0073  00e2 
    SW  (0005): 0002  0004 
  input props:
    <none>

4、getevent 檢視輸入裝置和檢視事件
列印輸出log日誌,等待輸入裝置,我們觸控式螢幕幕或是手機物理按鍵,便會看到這裡的變化

shell@hwH60:/ $ getevent

例如:
/dev/input/event0: 0001 014a 00000001
/dev/input/event0: 0003 0000 000000f6
/dev/input/event0: 0003 0001 000002ed
/dev/input/event0: 0003 0035 000000f6
/dev/input/event0: 0003 0036 000002ed
/dev/input/event0: 0003 0032 00000001
/dev/input/event0: 0003 0039 00000000
/dev/input/event0: 0003 003a 00000043
/dev/input/event0: 0000 0002 00000000

他們四個引數對應的是device type code value
device:指的是處理觸控和按鍵的輸入裝置。
type:指的是事件型別,EV_SYN [0000] (同步事件),EV_KEY [0001] (按鍵事件),EV_ABS [0003] (絕對值事件)
code 指的是前面type代表的事件中支援的編碼。
value 指的是值。

例如:需要模擬一次點選BACK鍵,模擬點選的功能通常都是使用 /dev/input/event0 這個輸入裝置,back鍵的型別為 0001(按鍵事件),BACK的編碼為 0x9e 轉換為十進位制後即158

注意的是在getevent中code顯示的是十六進位制,而sendevent時需要用十進位制

那我們輸入如下命令即可模擬一次BACK鍵的按下和彈起:

adb shell sendevent /dev/input/event0 1 158 1
adb shell sendevent /dev/input/event0 1 158 0

5、input keyevent 命令

先列舉 input keyevent 幾個比較常用的code值:

input keyevent 3    // Home

input keyevent 4    // Back

input keyevent 19  //Up

input keyevent 20  //Down

input keyevent 21  //Left

input keyevent 22  //Right

input keyevent 23  //Select/Ok

input keyevent 24  //Volume+

input keyevent 25  // Volume-

input keyevent 82  // Menu 選單

例如:
點選back鍵

shell@hwH60:/ $ input keyevent 3 

input text 命令
輸入框輸入內容的。後面引數為 “字串”,例如輸入”helloworld”字串

shell@hwH60:/ $ input text "helloworld!"

input tap 命令
模擬單擊事件 後面引數為: x y ,例如點選(168,252)位置

shell@hwH60:/ $ input tap 168 252  

input swipe 命令
此命令為滑動事件。例如:從 30 10 滑動到 30 100

shell@hwH60:/ $ input swipe 30 10 30 100

Android程式碼實現,注意需要root

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("getevent -p");  
execShellCmd("sendevent /dev/input/event0 1 158 1");  
execShellCmd("sendevent /dev/input/event0 1 158 0");  
execShellCmd("input keyevent 3");//home  
execShellCmd("input text  'helloworld!' ");  
execShellCmd("input tap 168 252");  
execShellCmd("input swipe 100 250 200 280"); 
<uses-permission android:name = "android.permission.INJECT_EVENTS"/>
歡迎關注微信公眾號:DroidMind
精品內容獨家釋出平臺


呈現與部落格不一樣的技術乾貨

相關推薦

Android程式碼模擬物理螢幕事件

一、應用中模擬物理和螢幕點選事件 例如,模擬對某個view的點選事件 private void simulateClick(View view, float x, float y) { long downTime = SystemClock.up

Android通過程式碼模擬物理螢幕事件

本文講的是通過使用程式碼,可以控制手機的螢幕和物理按鍵,也就是說不只是在某一個APP裡去操作,而是整個手機系統。 getevent/sendevent getevent&sendevent 是android系統下的一個工具,可以模擬多種按鍵和觸屏操作,產生的是

[Android]通過adb shell input上報命令模擬螢幕事件

常用的 input上報命令: input text 1234 實際向介面注入1234文字,有輸入框,能明顯看到效果 input keyevent 4 鍵盤事件,4 為返回 input tap 100 300 單擊觸屏事件 ,模擬點選x=100 y = 30

Android中Kotlin的學習(事件跳轉for迴圈RecyclerView回撥)

剛剛學習Kotlin,有什麼不對的地方請見諒。 首先屬性的宣告中有兩個很重要的關鍵字: var  和  val。 例如: var a = "hello" val b = "hello"區別是什麼呢? var可多次分配; val只能一次初始化。 點選事件: xml中View定

Android螢幕事件的實現

在android下,事件的發生是在監聽器下進行,android系統可以響應按鍵事件和觸控式螢幕事件,事件說明如下: 常用實現OnClickListener,OnTouchListener,OnFocu

Android開發之實現多次事件

 使用Google提供的api中採用的演算法 能夠實現n次點選事件,我們需要定義一個n長度的陣列,每點選一次將數組裡的內容按序號整體向左移動一格,然後給n-1出即陣列的最後添加當前的時間,如果0個位置的時間大於當前時間減去1000毫秒的話,那麼證明在1000毫秒內點選了n次。實現如

android listview系列之item的事件及item佈局中的事件(四)

很多時候listview只顯示簡略資訊,我們需要點選子項去跳轉或在顯示詳細資訊的位置,將相關的詳細資訊顯示出來,listview提供了onItemClickListener()方法,在方法中我們可以執行我們需要的內容。 listview.setOnItem

Android中的WebView禁止響應事件的方法

我們在做Android開發中,有時候需要用到WebView控制元件,當你把WebView新增到佈局中,你希望在點選整個佈局的時候,WebView不接收點選事件,應該向下傳遞。 舉個例子:在ListView中自定義的每一個Item中包含了WebView,你希望點選每一個行能

android listview裡包含元件(checkbox)事件和Item的事件衝突

在listview的item中包含有textview和checkBox。我們既想獲取listitem的點選事件,又想獲取listitem中textview的點選事件和listitem中checkBox的點選事件,那麼有沒有辦法實現呢?答案是肯定的,我們只需重新建立listview的介面卡繼承BaseAdpte

Android中常用的四種事件

1.匿名內部類的方式 findViewById(R.id.btn_submit).setOnClickListener(new View.OnClickListener() { @Override public

RecyclerView item內部事件item事件衝突

1.recyclerview item內部控制元件沒有點選事件 在recyclerview item內部控制元件不存在點選事件的情況下。item設定點選事件可通過新增觸控事件 recyclerv

RecyclerView的基本使用(優化圖片載入設定條目間距設定Adapter設定事件等)

首先需要v7包 如果顯示的是圖片,可以用下面這個AutoLoadRecyclerView,他可以在快速滑動時停止載入,避免OOM和記憶體資源浪費 public class AutoLoadRecyclerView extends RecyclerView { p

Android三種方法實現按鈕事件

0.我們都知道Java在開發介面的時候,需要使用監聽事件,只有在寫過監聽事件之後才能夠完整的使用軟體,比如說,我們在寫了一個button之後,想點選button,然後在文字標籤中變換字型該怎麼做呢?那麼我們就需要對button這個view進行新增監聽事件,新增完監聽事件之後,

在IE68中 button事件(onclick)沒得反應經驗總結

首先宣告我不經常寫js程式碼.對瀏覽器的相容性積累經驗不夠,特別是IE6、7、8的相容,總結此文章以便自己和大家一起積累,少花不必要的時間。 下面是我的js程式碼: /**** 儲存修改資料* @return*/function saveConten(){$.ajax({t

Android XRecyclerView最簡單的item事件處理

以前一直都是用PullToRefresh,後來覺得還是太out了。現在很多人都是用RecyclerView,很簡單的用法,佈局多樣化,主要是有瀑布流。這才知道RecyclerView.LayoutManager真正的強大。 但是說要addHeaderView這

【Cocos2dx】使用CCControlButton建立按鈕按鈕事件事件中的元件獲取,setPosition的座標問題

按鈕不僅在遊戲,在任何地方都是不可或缺卻又是最基本的東西。在遊戲引擎Cocos2dx中也不例外。 下面用一個例子說明Cocos2dx中如何使用按鈕,同時,如果在Cocos2dx中獲取層,也就是場景、舞臺中的元件。 如下圖,有一個按鈕Clickme,被點選時候與不被點選的時間

python ttk Treeview的插入清空各種事件獲取條目值標題單擊排序

昨天整了一天Tkinter的treeview,發現中文的教程乃至提問都很少,其中兩個問題的解決都是靠steakoverflow上找到的…… 在這裡放出來我遇到並解決的問題,大家以後可能遇到的話就能省點事了~ 插入方法: import tkinter from tki

Android EditText響應drawableRight等的事件

前言 我們在輸入框EditText中,經常會新增比如刪除X,下拉箭頭等圖示,以得到更好的使用者體驗和需求,如果放在右邊,我們經常設定drawableRight屬性來實現,那麼這些圖示如何響應點選事件呢?下面簡單記錄一下! 方法 首先我們要繼承AppCo

Android實現監聽控制元件事件

Android實現監聽控制元件點選事件 引言          這篇文章主要想寫一下Android實現監聽點選事件的幾種方法,Activity和Fragment實現起來有些方法上會有些不同,這裡也略做介紹。     &nbs

Android 模擬螢幕物理按鍵方式

在Android 中,有些特定的功能或者在除錯的時候需要模擬螢幕點選功能和物理按鍵等。 在實現上有2種方式: 首先是模擬螢幕點選的實現方式有兩種: 模擬螢幕點選 本程序內實現,就是隻有在自己的app上面實現。 跨程序實現,就是模擬點選手機螢幕的某個座標