Comment simuler le toucher depuis le service en arrière-plan avec sendevent ou d'une autre manière?

est-il possible de simuler le toucher à partir de l'application (ou du service) d'arrière-plan ou d'exécuter le script sh (qui simule le toucher)?

il est nécessaire pour tester le système android sans USB ou une autre connexion à PC, c'est pourquoi je ne peux pas (ou ne sais pas comment) utiliser Monkey ou d'autres outils d'autotest.

informations supplémentaires: J'ai trouvé le moyen d'exécuter des commandes shell avec root (dispositifs testés enracinés):

incapable d'exécuter sendevent commande shell via le code android (create touch simulation). de l'Écriture du fichier sur la partition système (exécuter des commandes avec les privilèges de root)

J'obtiens aussi des évènements pour simuler le toucher.

comme résultat j'ai:

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

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 problemsn");
    e.printStackTrace();
} catch (SecurityException se){
    se.printStackTrace();
} catch (InterruptedException e) {
    e.printStackTrace();
}

Je n'ai aucune exception, mais ce n'est pas le toucher simule.

quelqu'un Peut-il aider à résoudre ce problème?

S'il y a une autre façon de le faire avec android ndk ou daemon sur C, s'il vous plaît me le dire.

Merci.

30
demandé sur Community 2013-02-18 05:25:54

3 réponses

Je ne peux pas exécuter la commande "sendevent", mais j'ai trouvé un autre moyen pour moi, j'espère que ce sera utile pour quelqu'un.

Pour simuler le toucher, j'ai utilisé sendPointerSync() à partir d'android.App.Instrumentation, qui ne fonctionne qu'avec " android.autorisation.Autorisation D'INJECT_EVENTS". Pour l'utiliser, vous devez compiler votre application comme une application système. Pour ce faire, vous devez suivre les étapes suivantes:

  1. obtenir des fichiers à partir d'android source:

    racine-de-android-arbre-source/sortie/accueil//cadre/signapk.jar

    racine-de-android-arbre-source/build/cible/produit/sécurité/plate-forme.x509.pem

    racine-de-android-arbre-source/build/cible/produit/sécurité/plate-forme.pk8

  2. signer votre application à l'aide de l'obtention de fichiers:

    commande " java-jar signapk.pot de plate-forme.x509.plate-forme pem.pk8 Yourrapp-non signé.apk " Yourrapp-signed.apk.

  3. adb install Yourrapp-signed.apk
    • Exécuter votre application
    • utilisez "adb shell ps" pour confirmer que votre application fonctionne comme système.

Code avec simulation de contact (un nouveau fil est nécessaire pour la simulation):

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

Manifeste:

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

à l'Aide de ressources:

28
répondu v1k 2017-05-23 12:34:19

j'étais sur le point de mettre en œuvre votre solution quand je l'ai trouvé plus facile - affichage dans l'espoir qu'il sera utile à quelqu'un. Puisque vous avez déjà un appareil enraciné, vous n'avez pas besoin de signer comme une application système.

pour simuler un contact en position (100,200), il suffit d'appeler entrée depuis le service en utilisant Runtime.exec comme suit:

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
répondu simmons 2014-03-11 19:31:34

vous pouvez utiliser l'entrée" swipe". En regardant L'entrée .code source java vous pouvez voir les paramètres nécessaires pour faire un balayage.

voici un gist que j'ai fait pour simuler un coup pour jouer le jeu smove avec des clics au lieu de coups juste pour tester ceci. Vous avez besoin d'un accès super-utilisateur pour utiliser cette implémentation.

3
répondu MiichaelD 2017-04-05 21:45:41