如何模拟从后台服务与的SendEvent或其他方式联系?(How to simulate touch

2019-07-20 02:10发布

是否可以模拟从后台应用程序(或服务),或运行sh脚本(即模拟触摸)触摸?

这是需要测试Android系统没有USB或其它连接到PC,这就是为什么我不能(或不要知道如何)使用猴子或其他自动测试工具。

新增的信息:我发现以root运行shell命令(测试设备植根)的方式:

无法通过Android代码来执行的SendEvent外壳命令 (创建触摸模拟)。 上系统分区写入文件 (使用根权限运行命令)

此外,我得到的事件来模拟触摸。

因此,我有:

//sendevent commands to simulate touch (verify it work from cmd)
String[] touchEvent = { "sendevent /dev/input/event0 0 0 0\n",
                        "sendevent /dev/input/event6 3 53 499\n",
                        "sendevent /dev/input/event6 3 54 680\n",
                        "sendevent /dev/input/event6 3 58 40\n",
                        "sendevent /dev/input/event6 3 48 3\n",
                        "sendevent /dev/input/event6 3 57 0\n",
                        "sendevent /dev/input/event6 0 2 0\n",
                        "sendevent /dev/input/event6 0 0 0\n",
                        "sendevent /dev/input/event6 0 2 0\n",
                        "sendevent /dev/input/event6 0 0 0\n",
                        "sendevent /dev/input/event0 3 0 2\n",
                        "sendevent /dev/input/event0 0 0 0\n"};

try{
    Thread.sleep(2000);
    Process root = Runtime.getRuntime().exec("su");
    DataOutputStream os = new DataOutputStream(root.getOutputStream());             
    for(int i = 0; i < touchEvent.length; i++){
            Log.i(TAG, touchEvent[i]);  
            os.writeBytes(touchEvent[i]);
            os.flush();
    }
    root.waitFor();
} catch (IOException e) {
    Log.e(TAG, "Runtime problems\n");
    e.printStackTrace();
} catch (SecurityException se){
    se.printStackTrace();
} catch (InterruptedException e) {
    e.printStackTrace();
}

我没有任何异常,但不碰会模拟。

任何人可以帮助解决这个问题?

如果有另一种方式与Android NDK或守护程序做C的,请告诉我这件事。

谢谢。

Answer 1:

我不能执行“的SendEvent”命令,但发现我自己的另一种方式,希望这将是有益的人。

对于模拟触摸我用sendPointerSync()从android.app.Instrumentation,只有具有“android.permission.INJECT_EVENTS”权限的工作。 为了使用它,你应该编译你的应用程序作为一个系统的应用。 要做到这一点,你应该遵循下面的步骤:

  1. 充分利用Android的源文件:

    根的-机器人源树/出/主机//框架/ signapk.jar

    根的-机器人源树/建造/目标/产品/安全/ platform.x509.pem

    根的-机器人源树/建造/目标/产品/安全/ platform.pk8

  2. 使用获取文件签名的应用程序:

    命令“Java的罐子signapk.jar platform.x509.pem platform.pk8 YourApp-unsigned.apk” YourApp-signed.apk。

  3. 亚行安装YourApp,signed.apk
    • 运行你的应用程序
    • 使用“亚行外壳PS”,以确认您的应用程序正在运行的系统。

触摸模拟代码(新线程是必要的模拟):

Thread thread = new Thread(){
       @Override
       public void run(){
               Instrumentation m_Instrumentation = new Instrumentation();

               m_Instrumentation.sendPointerSync(MotionEvent.obtain(
                       SystemClock.uptimeMillis(),
                       SystemClock.uptimeMillis(),
                       MotionEvent.ACTION_DOWN,posx, posy, 0));
               m_Instrumentation.sendPointerSync(MotionEvent.obtain(
                       SystemClock.uptimeMillis(),
                       SystemClock.uptimeMillis(),
                       MotionEvent.ACTION_UP,width*4/5,height, 0));
       }
   };

表现:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp"
    **android:sharedUserId="android.uid.system"**
    android:versionCode="1"
    android:versionName="1.0" >

使用资源:

  • 在Android编程插入事件-第1部分
  • 如何编译Android应用程序以系统权限
  • 指令编译这里


Answer 2:

我正要实施解决方案时,我发现了一个更简单 - 发帖,希望这将是有帮助的人。 既然你已经有一个根深蒂固的设备,您不需要签署作为系统的应用程序。

为了模拟在位置(100,200)触摸,你需要从使用的Runtime.exec如下服务中调用输入 :

Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
String cmd = "/system/bin/input tap 100 200\n";
os.writeBytes(cmd);
os.writeBytes("exit\n");
os.flush();
os.close();
process.waitFor();


Answer 3:

您可以使用“刷卡”输入。 纵观Input.java源代码,你可以看到所需要的参数,使刷卡。

下面是我用于模拟刷卡做主旨玩的SMOVE游戏点击次数,而不是重击只是为了测试这一点。 你需要超级用户访问,虽然使用此实现。



文章来源: How to simulate touch from background service with sendevent or other way?