¿Cómo simular el servicio touch from background con sendevent u otra forma?


¿ Es posible simular el toque desde la aplicación (o servicio) en segundo plano o ejecutar el script sh (que simula el toque)?

Es necesario para probar el sistema Android sin USB u otra conexión a la PC, es por eso que no puedo (o no sé cómo) usar Monkey u otras herramientas de autotest.

Se ha añadido información: Encontré la manera de ejecutar comandos de shell con root (dispositivos probados rooteados):

No se puede ejecutar el comando de shell de sendevent a través del código de Android (create touch simulación). Escribir un archivo en la partición del sistema (ejecutar comandos con permisos de root)

También tengo eventos para simular el tacto.

Como resultado tengo:

//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();
}

No tengo ninguna excepción, pero no es el tacto simula.

¿Puede alguien ayudar a resolver este problema?

Si hay otra forma de hacerlo con android ndk o daemon en C, por favor dímelo.

Gracias.

Author: Community, 2013-02-18

3 answers

No puedo ejecutar el comando "sendevent", pero encontré otra manera para mí, espero que sea útil para alguien.

Para simular el toque utilicé sendPointerSync() desde Android.app.Instrumentación, que solo funcionan con " android.permiso.INJECT_EVENTS " permiso. Para usarlo, debe compilar su aplicación como una aplicación del sistema. Para hacerlo debe seguir los siguientes pasos:

  1. Obtener archivos de Android fuente:

    Root-of-android-source-tree / out / host / / framework / signapk.jar

    Raíz-de-android-source-tree / build / target / product / security / platform.x509.pem

    Raíz-de-android-source-tree / build / target / product / security / platform. pk8

  2. Firme su aplicación usando getting files:

    Comando " java-jar signapk.tarro plataforma.x509.pem platform. pk8 YourApp-sin firmar.apk " YourApp-firmado.apk.

  3. instalación de adb Tú firmaste.apk
    • Ejecute su aplicación
    • Use "adb shell ps" para confirmar que su aplicación se está ejecutando como sistema.

Código con simulación táctil (se necesita un nuevo hilo para la simulación):

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));
       }
   };

Manifiesto:

<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" >

Usando recursos:

 28
Author: v1k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:19

Estaba a punto de implementar su solución cuando encontré una más fácil: publicar con la esperanza de que sea útil para alguien. Dado que ya tiene un dispositivo rooteado, no necesita firmar como una aplicación del sistema.

Para simular un toque en la posición (100,200), todo lo que necesita es llamar a input desde dentro del servicio utilizando Runtime.exec como sigue:

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();
 27
Author: simmons,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-11 19:31:34

Puede usar la entrada "deslizar". Mirando la entrada .código fuente java puede ver los parámetros necesarios para hacer un deslizamiento.

Aquí hay una esencia que hice para simular un golpe para jugar el juego smove con clics en lugar de golpes solo para probar esto. Sin embargo, necesita acceso de superusuario para usar esta implementación.

 3
Author: MiichaelD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-05 21:45:41