バックグラウンドアプリケーション(またはサービス)からタッチをシミュレートすることや、(タッチをシミュレートする)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上のデーモンで別の方法がある場合は、それについて教えてください。
ありがとう。
「sendevent」コマンドを実行できませんが、自分にとって別の方法を見つけました。誰かに役立つことを願っています。
タッチをシミュレートするために、Android.app.InstrumentationのsendPointerSync()を使用しました。これは、「Android.permission.INJECT_EVENTS」権限でのみ機能します。使用するには、アプリをシステムアプリとしてコンパイルする必要があります。それを行うには、次の手順に従う必要があります。
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のルート
ファイルの取得を使用してアプリに署名します。
コマンド「Java -jar signapk.jar platform.x509.pem platform.pk8 YourApp-unsigned.apk」YourApp-signed.apk。
タッチシミュレーションを使用したコード(シミュレーションには新しいスレッドが必要です):
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" >
リソースの使用:
より簡単なものを見つけたとき、私はあなたのソリューションを実装しようとしていました-それが誰かに役立つことを期待して投稿してください。既にルート化されたデバイスを持っているため、システムアプリとして署名する必要はありません。
位置(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();
「スワイプ」入力を使用できます。 Input.Javaソースコード を見ると、スワイプを行うために必要なパラメーターを確認できます。
スワイプをシミュレートするために作成した要点 これをテストするために、スワイプではなくクリックで ゲームを移動 をプレイするためにただし、この実装を使用するにはスーパーユーザーアクセスが必要です。