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"/>
相關推薦
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進行新增監聽事件,新增完監聽事件之後,
在IE6、8中 、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上面實現。 跨程序實現,就是模擬點選手機螢幕的某個座標