模擬點擊在 Android 上有2種情況:
1,只模擬點擊自己的頁面;
2,只要自己進程活着,不管是哪個應用在前臺,都可以模擬點擊;
第一種情況比較簡單:
long downTime = SystemClock.uptimeMillis();
float x = 200;
float y = getResources().getDisplayMetrics().heightPixels - 200;
final MotionEvent downEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN, x, y, 0);
final MotionEvent upEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_UP, x, y, 0);
View view = findViewById(R.id.root);
view.dispatchTouchEvent(downEvent);
view.dispatchTouchEvent(upEvent);
downEvent.recycle();
upEvent.recycle();
有人可能發現了,這第一種模擬點擊自己的頁面,貌似沒什麼意義,因爲既然是自己的頁面,代碼都是我們自己寫,可以直接走點擊的方法,不需要這麼麻煩。不過還是有些特殊場景可能需要的,比如模擬點擊廣告。
第二種情況:
1,之前寫過一篇《牛逼的AccessibilityService》
2,如果是 root 手機或者是系統應用, 可以添加權限:
<uses-permission android:name="android.permission.INJECT_EVENTS"/>
則可以使用:
AsyncTask.execute(new Runnable() {
@Override
public void run() {
// 必須在 子線程
Instrumentation mInst = new Instrumentation();
mInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x, y, 0));
mInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0));
}
});
sendPointerSync 實際利用的是 InputManager 的 injectInputEvent 方法;