¿Cómo simular el toque del servicio en segundo plano con sendevent o de otra manera?

¿Es posible simular el toque desde la aplicación de fondo (o servicio) 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, por eso no puedo (o no sé cómo) usar Monkey u otras herramientas de autotest.

Información agregada: encontré la manera de ejecutar comandos de shell con root (dispositivos robados enraizados):

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

También obtengo 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 táctil simula.

¿Alguien puede ayudar a resolver este problema?

Si hay otra forma de hacerlo con android ndk o daemon en C, cuénteme al respecto.

Gracias.

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

Para simular el tacto, utilicé sendPointerSync () de android.app.Instrumentation, que funciona solo con el permiso “android.permission.INJECT_EVENTS”. Para su uso, debe comstackr su aplicación como una aplicación del sistema. Para hacerlo, debes seguir los siguientes pasos:

  1. Obteniendo archivos de la fuente de Android:

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

    root-of-android-source-tree / build / target / product / security / platform.x509.pem

    root-of-android-source-tree / build / target / product / security / platform.pk8

  2. Firma tu aplicación usando los archivos:

    Comando ” java -jar signapk.jar platform.x509.pem platform.pk8 YourApp-unsigned.apk ” YourApp-signed.apk.

  3. adb instala YourApp-signed.apk
    • Ejecuta tu aplicación
    • Use “adb shell ps” para confirmar que su aplicación se está ejecutando como sistema.

Código con simulación táctil (el nuevo hilo es necesario 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:

  


Usando recursos:

  • Inyección de eventos mediante progtwigción en Android – Parte 1
  • Cómo comstackr aplicaciones de Android con permisos del sistema
  • Instrucciones para comstackr aquí

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

Para simular un toque en la posición (100,200), todo lo que necesita hacer es llamar a la entrada desde dentro del servicio usando Runtime.exec de la siguiente manera:

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

Puede usar la entrada “deslizar”. Al mirar el código fuente de Input.java , puede ver los parámetros necesarios para deslizar.

Aquí hay una idea fundamental que hice para simular un deslizamiento 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.