[Android] android 中模擬click&touch的方法


  1.  使用shell方法
    adb shell #进入系统
    input keyevent KEYCODE_BACK #模拟按返回键
    input keyevent KEYCODE_HOME #模拟按Home键
    input tap 100 200  #在屏幕坐标(100, 200)处点击
    
    
  2. 使用instrument

    需要注意的是,这些方法均不可以在UI主线程中执行,必须放到子线程中调用,否则就会报错。另外,使用上面的方法,需要在AndroidManifast.xml中申明如下权限:

    1
    <uses-permission android:name="android.permission.INJECT_EVENTS"/>
    Instrumentation mInst = new Instrumentation();  
    mInst.sendKeyDownUpSync(KeyEvent.KEYCODE_CAMERA); //click
    Instrumentation mInst = new Instrumentation();  
    mInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
    SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x, y, 0); //x,y 即是事件的坐标
    mInst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
    SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0);
    sendCharacterSync(int keyCode)            //用于发送指定KeyCode的按键
    sendKeyDownUpSync(int key) //用于发送指定KeyCode的按键
    sendPointerSync(MotionEvent event) //用于模拟Touch
    sendStringSync(String text) //用于发送字符串

  3. 使用android 內部api
    try {
                InputManager im = (InputManager) InputManager.class.getDeclaredMethod("getInstance", new Class[0]).invoke(null, new Object[0]);
                Method injectInputEventMethod = InputManager.class.getMethod("injectInputEvent", new Class[]{InputEvent.class, Integer.TYPE});
    
                // 獲取當前系統時間作為事件的時間戳
                long downTime = SystemClock.uptimeMillis();
                long eventTime = SystemClock.uptimeMillis();
                // 指定動作類型(ACTION_DOWN 表示開始觸摸,ACTION_UP 表示結束觸摸)
                int actionDown = MotionEvent.ACTION_DOWN;
                int actionUp = MotionEvent.ACTION_UP;
                // 創建 MotionEvent
                MotionEvent motionEventDown = MotionEvent.obtain(
                        downTime,
                        eventTime,
                        actionDown,
                        x,
                        y,
                        0
                );
    
                MotionEvent motionEventUp = MotionEvent.obtain(
                        downTime,
                        eventTime+100,
                        actionUp,
                        x,
                        y,
                        0
                );
                // 注入 MotionEvent
                injectInputEventMethod.invoke(im, new Object[]{motionEventDown, Integer.valueOf(0)});
                injectInputEventMethod.invoke(im, new Object[]{motionEventUp, Integer.valueOf(0)});
                // 回收 MotionEvent 以釋放資源
                motionEventDown.recycle();
                motionEventUp.recycle();
            }catch (Exception e){
                Log.e(TAG, "getInputManager: "+ e.toString());
            }
    
    
    
    URL:
    https://itimetraveler.github.io/2016/06/02/%E3%80%90Android%E3%80%91%E6%8A%80%E6%9C%AF%E8%B0%83%E7%A0%94%EF%BC%9A%E7%94%A8%E4%BB%A3%E7%A0%81%E6%A8%A1%E6%8B%9F%E5%B1%8F%E5%B9%95%E7%82%B9%E5%87%BB%E3%80%81%E8%A7%A6%E6%91%B8%E4%BA%8B%E4%BB%B6/
    

留言

熱門文章