web-dev-qa-db-ja.com

sendeventまたは他の方法でバックグラウンドサービスからのタッチをシミュレートする方法は?

バックグラウンドアプリケーション(またはサービス)からタッチをシミュレートすることや、(タッチをシミュレートする)shスクリプトを実行することは可能ですか?

Android USBまたはPCへの他の接続のないシステム、Monkeyまたは他の自動テストツールを使用できない(または方法がわからない)ために必要です。

追加情報:ルート(テスト済みのデバイスをルート)でシェルコマンドを実行する方法を見つけました:

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上のデーモンで別の方法がある場合は、それについて教えてください。

ありがとう。

31
v1k

「sendevent」コマンドを実行できませんが、自分にとって別の方法を見つけました。誰かに役立つことを願っています。

タッチをシミュレートするために、Android.app.InstrumentationのsendPointerSync()を使用しました。これは、「Android.permission.INJECT_EVENTS」権限でのみ機能します。使用するには、アプリをシステムアプリとしてコンパイルする必要があります。それを行うには、次の手順に従う必要があります。

  1. Android source:

    root-of-Android-source-tree/out/Host // framework/signapk.jar

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

    Android-source-tree-root/build/target/product/security/platform.pk8のルート

  2. ファイルの取得を使用してアプリに署名します。

    コマンド「Java -jar signapk.jar platform.x509.pem platform.pk8 YourApp-unsigned.apk」YourApp-signed.apk。

  3. adb install YourApp-signed.apk
    • アプリを実行する
    • 「adb Shell 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" >

リソースの使用:

29
v1k

より簡単なものを見つけたとき、私はあなたのソリューションを実装しようとしていました-それが誰かに役立つことを期待して投稿してください。既にルート化されたデバイスを持っているため、システムアプリとして署名する必要はありません。

位置(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();
30
simmons

「スワイプ」入力を使用できます。 Input.Javaソースコード を見ると、スワイプを行うために必要なパラメーターを確認できます。

スワイプをシミュレートするために作成した要点 これをテストするために、スワイプではなくクリックで ゲームを移動 をプレイするためにただし、この実装を使用するにはスーパーユーザーアクセスが必要です。

3
MiichaelD