Android上的模拟点击

模拟点击在 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 方法;

你可能感兴趣的:(Android)